Pos blog ini adalah bagian ketiga dari rangkaian blog tentang indeks di MySQL . Di bagian kedua dari seri entri blog tentang indeks MySQL, kami membahas indeks dan mesin penyimpanan serta membahas beberapa pertimbangan KUNCI UTAMA. Diskusi tersebut mencakup cara mencocokkan awalan kolom, beberapa pertimbangan indeks FULLTEXT, dan bagaimana Anda harus menggunakan indeks B-Tree dengan karakter pengganti dan cara menggunakan ClusterControl untuk memantau kinerja kueri Anda, selanjutnya, indeks.
Dalam entri blog ini, kita akan membahas beberapa detail lebih lanjut tentang indeks di MySQL :kami akan membahas indeks hash, kardinalitas indeks, selektivitas indeks, kami akan memberi tahu Anda detail menarik tentang penutup indeks, dan kami juga akan membahas beberapa strategi pengindeksan. Dan, tentu saja, kita akan menyentuh ClusterControl. Mari kita mulai, ya?
Hash Index di MySQL
DBA MySQL dan pengembang yang berurusan dengan MySQL juga memiliki trik lain sejauh menyangkut MySQL - indeks hash juga merupakan opsi. Indeks hash sering digunakan di mesin MEMORY MySQL - seperti hampir semua hal di MySQL, indeks semacam itu memiliki kelebihan dan kekurangannya sendiri. Kelemahan utama dari jenis indeks ini adalah mereka hanya digunakan untuk perbandingan kesetaraan yang menggunakan operator =atau <=> yang berarti bahwa mereka tidak terlalu berguna jika Anda ingin mencari rentang nilai, tetapi keuntungan utamanya adalah pencarian yang sangat cepat. Beberapa kelemahan lainnya termasuk fakta bahwa pengembang tidak dapat menggunakan awalan paling kiri dari kunci untuk menemukan baris (jika Anda ingin melakukannya, gunakan indeks B-Tree sebagai gantinya), fakta bahwa MySQL tidak dapat menentukan berapa banyak baris yang ada. antara dua nilai - jika indeks hash sedang digunakan, pengoptimal juga tidak dapat menggunakan indeks hash untuk mempercepat operasi ORDER BY. Ingatlah bahwa indeks hash bukan satu-satunya yang didukung oleh mesin MEMORY - mesin MEMORY juga dapat memiliki indeks B-Tree.
Kardinalitas Indeks di MySQL
Sejauh menyangkut indeks MySQL, Anda mungkin juga mendengar istilah lain yang beredar - istilah ini disebut kardinalitas indeks. Dalam istilah yang sangat sederhana, kardinalitas indeks mengacu pada keunikan nilai yang disimpan dalam kolom yang menggunakan indeks. Untuk melihat kardinalitas indeks dari indeks tertentu, Anda cukup membuka tab Struktur phpMyAdmin dan mengamati informasi di sana atau Anda juga dapat menjalankan kueri SHOW INDEXES:
mysql> SHOW INDEXES FROM demo_table;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table | 1 | demo | 1 | demo | A | 494573 | NULL | NULL | | BTREE | | |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
Output kueri SHOW INDEXES yang dapat dilihat di atas seperti yang Anda lihat memiliki banyak bidang, salah satunya menggambarkan kardinalitas indeks:bidang ini mengembalikan perkiraan jumlah nilai unik dalam indeks - semakin tinggi kardinalitas, semakin besar kemungkinan pengoptimal kueri menggunakan indeks untuk pencarian. Dengan demikian, kardinalitas indeks juga memiliki saudara - namanya adalah selektivitas indeks.
Selektivitas Indeks di MySQL
Selektivitas indeks adalah jumlah nilai yang berbeda dalam kaitannya dengan jumlah catatan dalam tabel. Secara sederhana, selektivitas indeks mendefinisikan seberapa erat indeks database membantu MySQL mempersempit pencarian nilai. Selektivitas indeks yang ideal adalah nilai 1. Selektivitas indeks dihitung dengan membagi nilai yang berbeda dalam tabel dengan jumlah total catatan, misalnya, jika Anda memiliki 1.000.000 catatan di tabel Anda, tetapi hanya 100.000 di antaranya adalah nilai yang berbeda , selektivitas indeks Anda adalah 0,1. Jika Anda memiliki 10.000 catatan di tabel Anda dan 8.500 di antaranya adalah nilai yang berbeda, selektivitas indeks Anda akan menjadi 0,85. Itu lebih baik. Anda mengerti maksudnya. Semakin tinggi selektivitas indeks Anda, semakin baik.
Meliputi Indeks di MySQL
Indeks penutup adalah jenis indeks khusus di InnoDB. Saat indeks penutup sedang digunakan, semua bidang yang diperlukan untuk kueri disertakan, atau "tercakup", oleh indeks yang berarti bahwa Anda juga dapat memperoleh manfaat dari hanya membaca indeks, bukan data. Jika tidak ada yang membantu, indeks penutup bisa menjadi tiket Anda untuk meningkatkan kinerja. Beberapa manfaat menggunakan indeks penutup meliputi:
-
Salah satu skenario utama di mana indeks penutup mungkin berguna termasuk melayani kueri tanpa pembacaan I/O tambahan di atas meja besar.
-
MySQL juga dapat mengakses lebih sedikit data karena entri indeks lebih kecil dari ukuran baris.
-
Sebagian besar mesin penyimpanan mengindeks cache lebih baik daripada data.
Membuat indeks penutup pada tabel cukup sederhana - cukup tutupi bidang yang diakses oleh klausa SELECT, WHERE, dan GROUP BY:
ALTER TABLE demo_table ADD INDEX index_name(column_1, column_2, column_3);
Perlu diingat bahwa ketika berurusan dengan indeks penutup, sangat penting untuk memilih urutan kolom yang benar dalam indeks. Agar indeks penutup Anda efektif, letakkan kolom yang Anda gunakan dengan klausa WHERE terlebih dahulu, ORDER BY dan GROUP BY berikutnya dan kolom yang digunakan dengan klausa SELECT terakhir.
Strategi Pengindeksan di MySQL
Mengikuti saran yang tercakup dalam tiga bagian posting blog ini tentang indeks di MySQL dapat memberi Anda dasar yang sangat bagus, tetapi ada juga beberapa strategi pengindeksan yang mungkin ingin Anda gunakan jika Anda mau benar-benar memanfaatkan kekuatan indeks dalam arsitektur MySQL Anda. Agar indeks Anda mematuhi praktik terbaik MySQL, pertimbangkan:
-
Mengisolasi kolom tempat Anda menggunakan indeks - secara umum, MySQL tidak menggunakan indeks jika kolom tersebut digunakan pada tidak terisolasi. Misalnya, kueri seperti itu tidak akan menggunakan indeks karena tidak diisolasi:
SELECT demo_column FROM demo_table WHERE demo_id + 1 = 10;
Namun, kueri seperti itu akan:
SELECT demo_column FROM demo_table WHERE demo_id = 10;
-
Jangan gunakan indeks pada kolom yang Anda indeks. Misalnya, menggunakan kueri seperti itu tidak akan banyak membantu, jadi sebaiknya hindari kueri seperti itu jika Anda bisa:
SELECT demo_column FROM demo_table WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(column_date) <= 10;
-
Jika Anda menggunakan kueri LIKE bersama dengan kolom yang diindeks, hindari meletakkan karakter pengganti di awal kueri penelusuran karena dengan begitu MySQL juga tidak akan menggunakan indeks. Itu daripada menulis pertanyaan seperti ini:
SELECT * FROM demo_table WHERE demo_column LIKE ‘%search query%’;
Pertimbangkan untuk menulisnya seperti ini:SELECT * FROM demo_table WHERE demo_column LIKE ‘search_query%’;
Query kedua lebih baik karena MySQL mengetahui kolom dimulai dengan apa dan dapat menggunakan indeks dengan lebih efektif. Seperti semua hal, pernyataan EXPLAIN dapat sangat membantu jika Anda ingin memastikan indeks Anda benar-benar digunakan oleh MySQL.
Menggunakan ClusterControl untuk Menjaga Kinerja Kueri Anda
Jika Anda ingin meningkatkan kinerja MySQL Anda, saran di atas akan mengarahkan Anda ke jalur yang benar. Jika Anda merasa membutuhkan sesuatu yang lebih, pertimbangkan ClusterControl untuk MySQL. Salah satu hal yang ClusterControl dapat membantu Anda dengan menyertakan manajemen kinerja - seperti yang telah disebutkan dalam posting blog sebelumnya, ClusterControl juga dapat membantu Anda menjaga kueri Anda tetap berkinerja terbaik sepanjang waktu - itu karena ClusterControl juga menyertakan kueri monitor yang memungkinkan Anda memantau kinerja kueri Anda, melihat kueri yang berjalan lama dan lambat, dan juga outlier kueri yang memperingatkan Anda tentang kemungkinan kemacetan dalam kinerja database Anda sebelum Anda dapat melihatnya sendiri:
Anda bahkan dapat memfilter kueri yang memungkinkan Anda membuat asumsi jika indeks digunakan oleh kueri individu atau tidak:
ClusterControl dapat menjadi alat yang hebat untuk meningkatkan kinerja database Anda sambil menghilangkan kerumitan pemeliharaan dari tangan Anda. Untuk mempelajari lebih lanjut tentang apa yang dapat dilakukan ClusterControl untuk meningkatkan kinerja instans MySQL Anda, pertimbangkan untuk melihat halaman ClusterControl untuk MySQL.
Ringkasan
Seperti yang mungkin sudah Anda ketahui sekarang, indeks di MySQL adalah binatang yang sangat kompleks. Untuk memilih indeks terbaik untuk instans MySQL Anda, ketahui apa itu indeks dan apa fungsinya, ketahui jenis indeks MySQL, ketahui keuntungan dan kerugiannya, pelajari cara indeks MySQL berinteraksi dengan mesin penyimpanan, juga lihat ClusterControl untuk MySQL jika Anda merasa bahwa mengotomatiskan tugas-tugas tertentu yang terkait dengan indeks di MySQL dapat membuat hari Anda lebih mudah.