Penempatan Lajur Kardinaliti Tinggi dalam Indeks Komposit dengan Pertanyaan Julat
Apabila menanyakan jadual dengan indeks komposit yang melibatkan keadaan julat, peletakan lajur dalam indeks boleh memberi kesan ketara kepada prestasi.
Pertimbangkan fail jadual dengan kunci utama (did, nama fail) dan dua indeks komposit: INDEX(masa fail, ext) dan INDEX(ext, masa fail). Kedua-dua indeks mengandungi lajur masa fail, yang mempunyai kardinaliti lebih tinggi daripada ext.
Pertanyaan:
WHERE ext = '...' AND filetime BETWEEN ... AND ...
memerlukan mengakses data berdasarkan kedua-dua ext dan masa fail. Timbul persoalan: indeks manakah yang optimum untuk pertanyaan sedemikian?
Analisis
Untuk menentukan indeks optimum, kita boleh menggunakan FORCE INDEX dan memeriksa rancangan pelaksanaan:
-- Force range on filetime first FORCE INDEX(fe) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH; -- Force low-cardinality ext first FORCE INDEX(ef) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
Output menunjukkan bahawa INDEX(ext, filetime) (ef) mempunyai baris yang jauh lebih rendah kiraan, menunjukkan imbasan yang lebih cekap.
Jejak Pengoptimum
Untuk menganalisis lebih lanjut tingkah laku pengoptimum, kita boleh menggunakan jejak pengoptimum:
SELECT explain_format = 'JSON'; SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
Jejak mendedahkan bahawa pengoptimum memilih INDEX(ext, filetime) kerana ia boleh menggunakan kedua-dua lajur indeks untuk menapis dan mengambil data. Sebaliknya, INDEX(masa fail, ext) hanya boleh menggunakan lajur pertama (masa fail) untuk penapisan.
Kesimpulan
Berdasarkan analisis, kesimpulan berikut boleh dibuat dilukis:
Atas ialah kandungan terperinci Indeks Komposit manakah yang Optimum untuk Pertanyaan Julat: Lajur Kardinaliti Tinggi lwn. Rendah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!