Hal pertama yang harus diperhatikan adalah bahwa MySQL hanya menggunakan satu indeks per psuedo-SELECT (bukan pernyataan) - ketika Anda melihat output SELECT menggunakan EXPLAIN, Anda akan melihat indeks mana yang dipilih per. EXPLAIN hanya dapat dijalankan pada SELECT, jadi kita harus mengasumsikan bahwa DELETE/UPDATE menggunakan rencana yang sama ketika Anda menukar sintaks untuk SELECT...
Sebagian besar basis data (yang tertanam bisa aneh) sepengetahuan saya mendukung penggunaan indeks dalam klausa berikut:
- PILIH
- JOIN (sintaks ANSI-92)
- WHERE (karena ada ANSI-89 dan penyaringan di sini)
- HAVING (setara WHERE, tetapi tidak seperti WHERE - memungkinkan penggunaan agregat tanpa memerlukan subquery)
- PESAN OLEH
Saya tidak 100% tergabung dalam GROUP BY, jadi untuk saat ini saya mengabaikannya.
Pada akhirnya, ini adalah pilihan pengoptimal untuk apa yang akan digunakan berdasarkan algoritme dan statistik yang dimilikinya. Anda dapat menggunakan sintaks ANALYZE TABLE untuk menyegarkan statistik (secara berkala, jangan terus-menerus).
Tambahan
MySQL juga membatasi jumlah ruang untuk mengalokasikan indeks - 1.000 byte untuk tabel MyISAM, dan 767 byte untuk tabel InnoDB . Karena MySQL hanya menggunakan satu indeks per psuedo-SELECT, mencakup indeks (indeks yang mencakup lebih dari satu kolom) adalah ide yang bagus tetapi itu benar-benar datang untuk menguji kueri paling umum &mengoptimalkannya sebaik mungkin. Prioritas pengindeksan harus:
- Kunci utama (di suatu tempat di v5, pembuatan indeks untuk pk menjadi otomatis)
- Kunci asing (kemungkinan besar berikutnya GABUNG kandidat
- Kriteria filtrasi (dengan asumsi Anda memiliki ruang)