Secara umum:
1. Jangan tambahkan indeks kecuali Anda benar-benar membutuhkannya.
Setiap indeks membuat penulisan lebih lambat...
2. Sebuah indeks akan digunakan pada klausa where:
-- index on foo (bar)
select bar from foo where bar = :bar;
Dengan cara yang sama, itu akan digunakan dalam referensi kunci asing (di kedua tabel).
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
3. Sebuah indeks akan digunakan untuk menyortir, terutama jika terikat pada suatu batas:
-- index on foo (bar)
select bar from foo order by bar limit 10;
4. Indeks multikolom terkadang berguna ketika 2. dan 3. keduanya berlaku.
Dalam hal ini tempatkan kondisi where terlebih dahulu, dan kunci sortir terakhir:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
5. Perbarui statistik tabel Anda.
Jika statistik tabel adalah sampah, kecil kemungkinan pengoptimal akan menggunakan indeks Anda. Mengosongkan/menganalisis basis data Anda secara manual jika diperlukan.
6. Penggunaan indeks bergantung pada partisi ulang tabel Anda.
Melewati ambang batas tertentu dari baris yang diambil, akan lebih cepat untuk melakukan pemindaian tabel penuh. Jika indeks Anda berada di bidang boolean yang kurang lebih membagi tabel Anda menjadi dua, itu tidak akan pernah digunakan.
Demikian juga, jika data Anda disimpan sedemikian rupa sehingga pemindaian indeks kemungkinan akan berakhir secara acak mengakses halaman disk yang hampir selalu berlaku untuk tabel itu, perencana akan lebih memilih pemindaian tabel penuh.
7. Pertimbangkan indeks parsial/ekspresi jika tersedia.
Jika Anda memiliki bidang yang memiliki nilai yang sama kecuali 10% dari baris Anda, pertimbangkan indeks parsial di dalamnya (yaitu di mana bukan nilai itu). Ini menghasilkan indeks yang jauh lebih kecil tanpa menghalangi kegunaannya yang sebenarnya.
Jika Anda terus-menerus menanyakan ekspresi yang diterapkan ke kolom Anda dan platform Anda menawarkan indeks ekspresi, pertimbangkan untuk menambahkan indeks di atasnya. Saat digunakan, ekspresi tidak akan dievaluasi untuk setiap baris.