Saya telah mengatur meja saya dengan indeks hanya pada done_status (done_status = INT):
Ketika saya menggunakan:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Saya mendapatkan ini kembali:
id select_type jenis tabel kemungkinan kunci key_len key baris ref ref Extra 1 SIMPLE pengingat SEMUA selesai_status NULL NULL NULL 5 Menggunakan di mana
Tetapi ketika saya mengeluarkan perintah ini:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Saya mendapatkan yang berikut ini:
id select_type jenis tabel kemungkinan kunci key_len key baris ref ref Extra 1 pengingat SIMPLE ref done_status done_status 4 const 2
The EXPLAIN
menunjukkan saya bahwa ia menggunakan 5 baris, kedua kalinya 2 baris.
Saya tidak berpikir indeks digunakan, jika saya memahaminya dengan benar pertama kali harus memberi saya 3 baris. Apa yang saya lakukan salah?
SHOW INDEX FROM reminder
:
Tabel Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Komentar Index_comment pengingat 1 done_status 1 done_status A 5 NULL NULL BTREE
jelaskan diperpanjang:
id select_type jenis tabel kemungkinan kunci key_len key baris ref disaring Ekstra 1 pengingat SIMPLE ref done_status done_status 4 const 2 100.00
show warnings
tidak menunjukkan minat.
Jawaban:
Anda salah memahami bidang 'baris' itu. Ini adalah jumlah baris yang diperkirakan mysql perlu dibaca untuk memenuhi permintaan Anda. Nilai ini bisa sangat tidak akurat. Ini tidak berarti ini adalah jumlah baris dalam hasil - atau jumlah aktual baris yang dibaca oleh mysql
sumber
Dataran eksekusi pertama tidak menggunakan indeks pasti,
itu bisa menjadi information_schema.statistik pada indeks tidak mengejar data setelah beberapa operasi penulisan, atau tabel tidak diakses untuk waktu yang lama.
seperti yang dijelaskan di sini: - Dari mana MySQL Query Optimizer membaca statistik indeks?
untuk rencana eksekusi kedua, sepertinya information_schema.statistics sudah mengejar dan memperbaiki masalah kardinalitas NULL.
Oleh karena itu, jalankan kueri sesuai dengan pengoptimal indeks.
Untuk meja dengan baris kecil, tidak masalah.
Tetapi data akan tumbuh, pengembang harus selalu melakukan pemeriksaan ini,
dan melakukan tabel analisis yang diperlukan ketika menjumpai kardinalitas nol pada indeks.
sumber
Paket eksekusi pertama tidak menggunakan indeks.
Dari Situs Referensi MySQL :
Jika tabel Anda hanya memiliki 5 baris dan kueri Anda memilih 3 dari mereka, maka pengoptimal MySQL mengasumsikan bahwa lebih efisien untuk memindai seluruh tabel.
sumber