Bagaimana saya bisa tahu jika indeks sedang digunakan untuk mengurutkan di MySQL?

10

Saya punya permintaan dengan klausa ORDER BY yang menggunakan kolom yang merupakan kolom terakhir pada indeks yang sedang digunakan dalam klausa WHERE, pada dasarnya dari bentuk:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

dan indeks dibuat pada kolom (col_1, col_2, col_3, col_4) dalam urutan itu.

Ketika saya memprofilkan kueri, lebih dari 99% waktu dihabiskan dalam kondisi "Menyortir hasil". col_4 adalah kolom stempel waktu jika ada bedanya. Saya mengerti bahwa ORDER BY hanya dapat menggunakan indeks dalam keadaan tertentu, tapi saya masih agak bingung kapan tepatnya pengoptimal melakukannya.

Chris Cooper
sumber

Jawaban:

13

Anda harus menambahkan EXPLAIN EXTENDEDsebelum permintaan dan melihat sendiri hasilnya.

Seharusnya ada entri untuk

  • mungkin_kunci

Jika kolom ini NULL, tidak ada indeks yang relevan. Dalam hal ini, Anda mungkin dapat meningkatkan kinerja kueri Anda dengan memeriksa klausa WHERE untuk memeriksa apakah itu merujuk pada beberapa kolom atau kolom yang akan cocok untuk pengindeksan.

dan

  • Kunci

Kolom kunci menunjukkan kunci (indeks) yang benar-benar diputuskan untuk digunakan oleh MySQL. Jika MySQL memutuskan untuk menggunakan salah satu indeks kemungkinan_keys untuk mencari baris, indeks itu terdaftar sebagai nilai kunci.

Untuk informasi lebih lanjut, Anda dapat merujuk Jelaskan output ini dan Jelaskan join_types

Mahesh Patil
sumber
Saya mengerti, pertanyaan saya secara khusus, adalah berkaitan dengan klausa ORDER BY. Kueri saya menggunakan indeks yang ditentukan untuk membatasi baris yang dikembalikan tetapi mengingat kinerja dari jenis yang saya duga itu tidak menggunakannya untuk klausa ORDER BY.
Chris Cooper
1
Dalam beberapa kasus, MySQL dapat menggunakan indeks untuk memenuhi klausa ORDER BY tanpa melakukan penyortiran tambahan. Indeks juga dapat digunakan bahkan jika ORDER BY tidak sama persis dengan indeks, selama semua bagian indeks yang tidak digunakan dan semua kolom ORDER BY tambahan adalah konstanta dalam klausa WHERE. Kueri berikut menggunakan indeks untuk menyelesaikan bagian ORDER OLEH merujuk ke dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil
1

Anda gunakan EXPLAINpada permintaan Anda ( explain select-or-whatever-your-query-is).

possible_keysperlihatkan yang bisa digunakan, keyyang benar-benar digunakan.

sja
sumber
1
Untuk menambah itu: explain format=json select ...bahkan lebih kuat. Itu termasuk used_key_parts, yang memberi tahu Anda apakah kunci komposit digunakan sebagian atau seluruhnya, dan index_conditionakan memberi tahu Anda bagian mana dari kueri yang bertanggung jawab atas indeks mana.
okdewit