Kueri Kasus A :
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY some_column DESC
LIMIT 20
Indeks:
(thread_id, date_created)
Rencana:
Index is used
Using Where
Using filesort
Tidak masalah di sana, kan? Jika indeks digunakan (untuk mencocokkan sebagian WHERE
kondisi), kami masih memerlukan operasi pengurutan untuk memesan hasilnya dengan some_column
(yang tidak ada dalam indeks). Kami juga membutuhkan pemeriksaan tambahan (Menggunakan Di Mana) untuk menjaga hanya baris yang cocok dengan kondisi ke-2 juga. BAIK.
Kasus B (pertanyaan)
Pertanyaan:
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Indeks:
(thread_id, date_created)
Rencana:
Index is used
Using Where
-- no "Using filesort"
Jadi, mengapa tidak perlu disortir di sini ? Karena indeks sudah cukup untuk disortir sesuai permintaan kueri. Tentu saja ada masalah tambahan dari kondisi ekstra ( AND placeholder = FALSE
) yang tidak tercakup oleh indeks.
OK tapi kita tidak benar-benar membutuhkan yang di sini. Indeks dapat memberikan kami hasil yang sesuai dengan kondisi pertama ( WHERE thread_id = 12345
) dan berada dalam urutan yang diinginkan untuk hasil. Satu-satunya pemeriksaan tambahan yang kita butuhkan - dan apa yang dilakukan rencana - adalah untuk mendapatkan baris dari tabel, dalam urutan yang disediakan oleh indeks, dan memeriksa kondisi ke-2 ini sampai kita mendapatkan 20 pertandingan. Itulah arti ** Menggunakan Di mana "".
Kami mungkin mendapatkan 20 pertandingan di 20 baris pertama (sangat bagus dan cepat) atau di 100 pertama (masih mungkin cukup cepat) atau di 1000000 pertama (mungkin sangat, sangat lambat) atau kami mungkin hanya mendapatkan 19 pertandingan dari tabel bahkan setelah membaca semua baris yang cocok dari indeks (benar-benar sangat lambat di meja besar). Itu semua tergantung pada distribusi data.
Kasus C (bahkan rencana yang lebih baik)
Kueri:
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Indeks:
(placeholder, thread_id, date_created)
Rencana:
Index is used
-- no "Using Where"
-- no "Using filesort"
Sekarang indeks kami cocok dengan kondisi dan urutan. Rencananya cukup sederhana: dapatkan * 20 kecocokan pertama dari indeks dan baca baris yang sesuai dari tabel. Tidak diperlukan pemeriksaan tambahan (Tidak Ada "Menggunakan Tempat") dan tidak ada jenis (tidak "Menggunakan Filesort")
first *: 20 pertama saat membaca indeks mundur dari akhir (seperti yang kita miliki ORDER BY .. DESC
) tapi itu tidak masalah. Indeks B-tree dapat dibaca maju dan mundur dengan kinerja yang hampir sama.