Sebuah indeks dapat membantu bahkan pada bidang kardinalitas rendah jika:
-
Ketika salah satu nilai yang mungkin sangat jarang dibandingkan dengan nilai lainnya dan Anda mencarinya.
Misalnya, ada sangat sedikit wanita buta warna, jadi pertanyaan ini:
SELECT * FROM color_blind_people WHERE gender = 'F'
kemungkinan besar akan mendapat manfaat dari indeks pada
gender
. -
Saat nilai cenderung dikelompokkan dalam urutan tabel:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Padahal hanya ada
3
tahun yang berbeda di sini, catatan dengan tahun sebelumnya kemungkinan besar ditambahkan terlebih dahulu sehingga sangat banyak catatan yang harus dipindai sebelum mengembalikan2010
pertama rekam jika bukan karena indeks. -
Saat Anda membutuhkan
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Tanpa indeks,
filesort
akan diperlukan. Meskipun agak dioptimalkan lakukan padaLIMIT
, itu masih membutuhkan pemindaian tabel lengkap. -
Ketika indeks mencakup semua bidang yang digunakan dalam kueri:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Saat Anda membutuhkan
DISTINCT
:SELECT DISTINCT color FROM tshirts
MySQL
akan menggunakanINDEX FOR GROUP-BY
, dan jika Anda memiliki sedikit warna, kueri ini akan instan bahkan dengan jutaan catatan.Ini adalah contoh skenario ketika indeks pada bidang kardinalitas rendah lebih efisien daripada di bidang kardinalitas tinggi.
Perhatikan bahwa jika DML
kinerja tidak terlalu menjadi masalah, maka aman untuk membuat indeks.
Jika pengoptimal menganggap indeks tidak efisien, indeks tidak akan digunakan.