Indeks di MySQL adalah binatang yang sangat kompleks. Kami telah membahas indeks MySQL di masa lalu, tetapi kami tidak pernah mempelajarinya lebih dalam - kami akan melakukannya dalam rangkaian posting blog ini. Posting blog ini harus bertindak sebagai panduan yang sangat umum untuk indeks sementara bagian lain dari seri ini akan menyelam lebih dalam ke mata pelajaran ini.
Apa itu Indeks?
Secara umum, seperti yang telah disebutkan dalam posting blog sebelumnya tentang indeks, indeks adalah daftar abjad catatan dengan referensi ke halaman di mana mereka disebutkan. Di MySQL, indeks adalah struktur data yang paling umum digunakan untuk menemukan baris dengan cepat. Anda mungkin juga mendengar istilah "kunci" - ini juga merujuk pada indeks.
Apa yang Dilakukan Indeks?
Di MySQL, indeks digunakan untuk menemukan baris dengan nilai kolom tertentu dengan cepat dan mencegah pembacaan seluruh tabel untuk menemukan baris yang relevan dengan kueri. Indeks sebagian besar digunakan ketika data yang disimpan dalam sistem database (misalnya, MySQL) semakin besar karena semakin besar tabel, semakin besar kemungkinan Anda mendapat manfaat dari indeks.
Jenis Indeks MySQL
Mengenai MySQL, Anda mungkin pernah mendengar tentang MySQL yang memiliki beberapa jenis indeks:
-
A B-Tree INDEX - indeks semacam itu sering digunakan untuk mempercepat kueri SELECT yang cocok dengan klausa WHERE. Indeks semacam itu dapat digunakan pada bidang di mana nilainya tidak perlu unik, ia juga menerima nilai NULL.
-
A FULLTEXT INDEX - indeks semacam itu digunakan untuk menggunakan kemampuan penelusuran teks lengkap. Jenis indeks ini menemukan kata kunci dalam teks alih-alih membandingkan nilai secara langsung dengan nilai dalam indeks.
-
INDEX UNIK sering digunakan untuk menghapus nilai duplikat dari tabel. Menerapkan keunikan nilai baris.
-
KUNCI UTAMA juga merupakan indeks - sering digunakan bersama dengan bidang yang memiliki atribut AUTO_INCREMENT. Jenis indeks ini tidak menerima nilai NULL dan sekali disetel, nilai pada kolom yang memiliki KUNCI UTAMA tidak dapat diubah.
-
A DESCENDING INDEX adalah indeks yang menyimpan baris dalam urutan menurun. Jenis indeks ini diperkenalkan di MySQL 8.0 - MySQL akan menggunakan jenis indeks ini ketika urutan menurun diminta oleh kueri.
Memilih Tipe Data Optimal untuk Indeks di MySQL
Sejauh menyangkut indeks, perlu diingat juga bahwa MySQL mendukung berbagai tipe data dan beberapa tipe data tidak dapat digunakan bersama dengan jenis indeks tertentu (misalnya, FULLTEXT indeks hanya dapat digunakan pada kolom berbasis teks (CHAR, VARCHAR atau TEXT) - tidak dapat digunakan pada tipe data lainnya) jadi sebelum benar-benar memilih indeks untuk desain database Anda, tentukan tipe data yang akan Anda gunakan kolom yang dimaksud (putuskan jenis kelas data apa yang akan Anda simpan:apakah Anda akan menyimpan angka? Nilai string? Angka dan nilai string? dll.), lalu tentukan rentang nilai yang akan Anda simpan (pilih salah satu yang menurut Anda tidak akan melebihi karena meningkatkan rentang tipe data dapat menjadi tugas yang memakan waktu di kemudian hari - kami sarankan Anda memilih untuk menggunakan tipe data sederhana), dan jika Anda tidak bermaksud menggunakan NULL nilai di kolom Anda, tentukan bidang Anda sebagai NOT NULL kapan pun Anda bisa - saat co lumn diindeks, memerlukan byte tambahan per entri.
Memilih Kumpulan Karakter dan Kumpulan Karakter yang Optimal untuk Indeks di MySQL
Selain tipe data, perlu diingat juga bahwa setiap karakter di MySQL membutuhkan ruang. Misalnya, karakter UTF-8 dapat mengambil antara 1 dan 4 byte masing-masing, jadi Anda mungkin ingin menghindari pengindeksan, misalnya, 255 karakter dan hanya menggunakan, katakanlah, 50 atau 100 karakter untuk kolom tertentu.
Manfaat dan Kekurangan Menggunakan Indeks di MySQL
Manfaat utama menggunakan indeks di MySQL adalah peningkatan kinerja kueri penelusuran yang cocok dengan klausa WHERE - indeks mempercepat kueri SELECT yang cocok dengan klausa WHERE karena MySQL tidak membaca seluruh tabel untuk menemukan baris relevan dengan kueri. Namun, ingatlah bahwa indeks memiliki kelemahannya sendiri. Yang utama adalah sebagai berikut:
-
Indeks menghabiskan ruang disk.
-
Indeks menurunkan kinerja kueri INSERT, UPDATE, dan DELETE - saat data diperbarui, indeks harus diperbarui bersama dengannya.
-
MySQL tidak melindungi Anda dari penggunaan beberapa jenis indeks secara bersamaan. Dengan kata lain, Anda dapat menggunakan PRIMARY KEY, INDEX dan UNIQUE INDEX pada kolom yang sama - MySQL tidak melindungi Anda dari melakukan kesalahan seperti itu.
Jika Anda menduga bahwa beberapa kueri Anda menjadi lebih lambat, pertimbangkan untuk melihat tab Monitor Kueri dari ClusterControl - dengan mengaktifkan monitor kueri, Anda dapat melihat kapan kueri tertentu terakhir terlihat dan maksimumnya dan waktu eksekusi rata-rata yang dapat membantu Anda memilih indeks terbaik untuk tabel Anda.
Bagaimana Memilih Indeks Terbaik untuk Digunakan?
Untuk memilih indeks terbaik untuk digunakan, Anda dapat menggunakan mekanisme bawaan MySQL. Misalnya, Anda dapat menggunakan penjelasan kueri - kueri JELASKAN. Ini akan menjelaskan tabel apa yang digunakan, apakah memiliki partisi atau tidak, indeks apa yang mungkin digunakan dan kunci (indeks) apa yang digunakan. Ini juga akan mengembalikan panjang indeks dan jumlah baris yang dikembalikan kueri Anda:
mysql> EXPLAIN SELECT * FROM demo_table WHERE demo_field = ‘demo’\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: demo_table
partitions: NULL
type: ref
possible_keys: demo_field
key: demo_field
key_len: 1022
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
Dalam hal ini, ingatlah bahwa indeks sering digunakan untuk membantu MySQL mengambil data secara efisien ketika kumpulan data lebih besar dari biasanya. Jika tabel Anda kecil, Anda mungkin tidak perlu menggunakan indeks, tetapi jika Anda melihat tabel Anda semakin lama semakin besar, kemungkinan besar Anda akan mendapat manfaat dari indeks.
Namun, untuk memilih indeks terbaik yang akan digunakan untuk skenario spesifik Anda, ingatlah bahwa indeks juga dapat menjadi penyebab utama masalah kinerja. Perlu diingat bahwa apakah MySQL akan secara efektif menggunakan indeks atau tidak tergantung pada beberapa faktor termasuk desain kueri Anda, indeks yang digunakan, jenis indeks yang digunakan, juga beban basis data Anda pada saat kueri dijalankan dan hal-hal lain. Berikut beberapa hal yang perlu dipertimbangkan saat menggunakan indeks di MySQL:
-
Berapa banyak data yang Anda miliki? Mungkin beberapa di antaranya berlebihan?
-
Kueri apa yang Anda gunakan? Apakah pertanyaan Anda akan menggunakan klausa LIKE? Bagaimana dengan pemesanan?
-
Jenis indeks apa yang perlu Anda gunakan untuk meningkatkan kinerja kueri Anda?
-
Apakah indeks Anda besar atau kecil? Apakah Anda perlu menggunakan indeks pada awalan kolom untuk memperkecil ukurannya?
Perlu dicatat bahwa Anda mungkin harus menghindari penggunaan beberapa jenis indeks (misalnya indeks B-Tree, INDEKS UNIK, dan KUNCI UTAMA) pada kolom yang sama juga.
Meningkatkan Kinerja Kueri dengan Indeks
Untuk meningkatkan kinerja kueri dengan indeks, Anda perlu melihat kueri Anda - pernyataan EXPLAIN dapat membantu dengan itu. Secara umum, berikut ini beberapa hal yang harus Anda pertimbangkan jika Anda ingin indeks Anda meningkatkan kinerja kueri Anda:
-
Hanya minta database untuk apa yang Anda butuhkan. Dalam kebanyakan kasus, menggunakan kolom SELECT akan lebih cepat daripada menggunakan SELECT * (begitu juga tanpa menggunakan indeks)
-
Indeks B-tree mungkin cocok jika Anda mencari nilai yang tepat (mis. SELECT * FROM demo_table WHERE some_field ='x') atau jika Anda ingin mencari nilai menggunakan wildcard (mis. SELECT * FROM demo_table WHERE some_field LIKE 'demo%' - dalam kasus ini, ingatlah bahwa menggunakan kueri LIKE dengan apa pun di awal mungkin dapat dilakukan lebih berbahaya daripada baik - hindari menggunakan kueri LIKE dengan tanda persentase di depan teks yang Anda cari - dengan cara itu MySQL mungkin tidak menggunakan indeks karena tidak tahu dengan apa nilai baris dimulai) - meskipun perlu diingat bahwa indeks B-tree juga dapat digunakan untuk perbandingan kolom dalam ekspresi yang menggunakan sama (=), lebih dari (>), lebih dari atau sama dengan (>=), kurang dari (<), kurang dari atau sama dengan (<=) atau ANTARA operator.
-
Indeks FULLTEXT mungkin cocok jika Anda menggunakan teks lengkap (MATCH ... AGAINST( )) kueri pencarian atau jika database Anda dirancang sedemikian rupa sehingga hanya menggunakan kolom berbasis teks - indeks FULLTEXT dapat menggunakan kolom TEXT, CHAR atau VARCHAR, indeks tersebut tidak dapat digunakan pada jenis kolom lainnya.
-
Indeks penutup mungkin berguna jika Anda ingin menjalankan kueri tanpa pembacaan I/O tambahan di tabel besar . Untuk membuat indeks penutup, tutupi klausa WHERE, GROUP BY, dan SELECT yang digunakan oleh kueri.
Kita akan melihat lebih jauh jenis indeks di bagian mendatang dari seri blog ini, tetapi secara umum, jika Anda menggunakan kueri seperti SELECT * FROM demo_table WHERE some_field ='x' a B-tree INDEX mungkin cocok, jika Anda menggunakan kueri MATCH() AGAINST() Anda mungkin harus melihat indeks FULLTEXT, jika tabel Anda memiliki nilai baris yang sangat panjang, Anda mungkin harus melihat pengindeksan bagian kolom.
Berapa Banyak Indeks yang Harus Anda Miliki?
Jika Anda pernah menggunakan indeks untuk meningkatkan kinerja kueri SELECT, Anda mungkin bertanya pada diri sendiri:berapa banyak indeks yang sebenarnya harus Anda miliki? Untuk memahami hal ini, Anda perlu mengingat hal-hal berikut:
-
Indeks biasanya paling efektif dengan data dalam jumlah besar.
-
MySQL hanya menggunakan satu indeks per setiap pernyataan SELECT dalam kueri (subkueri dilihat sebagai pernyataan terpisah) - gunakan kueri EXPLAIN untuk mengetahui indeks mana yang paling efektif untuk kueri yang Anda gunakan.
-
Indeks harus membuat semua pernyataan SELECT Anda cukup cepat tanpa mengorbankan terlalu banyak ruang disk - “cukup cepat” , bagaimanapun, adalah relatif sehingga Anda perlu bereksperimen.
Indeks dan Mesin Penyimpanan
Saat menangani indeks di MySQL, ingat juga bahwa mungkin ada beberapa jenis batasan jika Anda menggunakan berbagai mesin (misalnya jika Anda menggunakan MyISAM sebagai lawan InnoDB). Kami akan membahas lebih detail di blog terpisah, tetapi berikut adalah beberapa ide:
-
Jumlah maksimum indeks per tabel MyISAM dan InnoDB adalah 64, jumlah maksimum kolom per indeks di keduanya mesin penyimpanan adalah 16.
-
Panjang kunci maksimum untuk InnoDB adalah 3500 byte - panjang kunci maksimum untuk MyISAM adalah 1000 byte.
-
Indeks teks lengkap memiliki batasan dalam mesin penyimpanan tertentu - misalnya, indeks teks lengkap InnoDB memiliki 36 stopword, MyISAM daftar stopword sedikit lebih besar dengan 143 stopword. InnoDB mengambil stopword ini dari variabel innodb_ft_server_stopword_table sementara MyISAM mengambil stopword ini dari file storage/myisam/ft_static.c - semua kata yang ditemukan dalam file akan diperlakukan sebagai stopword.
-
MyISAM adalah satu-satunya mesin penyimpanan dengan dukungan untuk opsi pencarian teks lengkap hingga MySQL 5.6 (MySQL 5.6. 4 tepatnya) muncul yang berarti bahwa InnoDB mendukung indeks teks lengkap sejak MySQL 5.6.4. Saat indeks FULLTEXT digunakan, indeks akan menemukan kata kunci dalam teks alih-alih membandingkan nilai secara langsung dengan nilai dalam indeks.
-
Indeks memainkan peran yang sangat penting untuk InnoDB - InnoDB mengunci baris saat mengaksesnya, jadi jumlah baris akses InnoDB dapat mengurangi kunci.
-
MySQL memungkinkan Anda menggunakan indeks duplikat pada kolom yang sama.
-
Mesin penyimpanan tertentu memiliki jenis indeks default tertentu (misalnya untuk mesin penyimpanan MEMORY, jenis indeks default adalah hash )
Ringkasan
Pada bagian tentang indeks di MySQL ini, kita telah membahas beberapa hal umum yang berkaitan dengan indeks dalam sistem manajemen basis data relasional ini. Dalam posting blog yang akan datang, kita akan membahas beberapa skenario yang lebih mendalam tentang penggunaan indeks di MySQL termasuk penggunaan indeks di mesin penyimpanan tertentu, dll. - kami juga akan menjelaskan bagaimana ClusterControl dapat digunakan untuk mencapai sasaran kinerja Anda di MySQL.