Pengoptimuman Indeks untuk Pertanyaan Julat
Lajur dengan kardinaliti yang lebih tinggi menyumbang kepada indeks yang lebih cekap dalam MySQL. Walau bagaimanapun, dalam kes pertanyaan julat, pengecualian dikenakan.
Pernyataan Masalah
Pertimbangkan jadual dengan struktur berikut:
CREATE TABLE `files` ( `did` int(10) UNSIGNED NOT NULL DEFAULT '0', `filename` VARBINARY(200) NOT NULL, `ext` VARBINARY(5) DEFAULT NULL, `fsize` DOUBLE DEFAULT NULL, `filetime` DATETIME DEFAULT NULL, PRIMARY KEY (`did`,`filename`), KEY `fe` (`filetime`,`ext`), -- Option 1 KEY `ef` (`ext`,`filetime`) -- Option 2 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Masa fail adalah berbeza, manakala terdapat bilangan nilai ext yang terhad (iaitu, kardinaliti yang lebih tinggi untuk masa fail, kardinaliti yang lebih rendah untuk samb). Pertanyaan melibatkan kedua-dua lajur dengan syarat berikut:
WHERE ext = '...' AND filetime BETWEEN ... AND ...
Indeks yang manakah, fe atau ef, yang lebih optimum?
Jawapan
Mengejutkan , indeks dengan ext sebagai lajur pertama, walaupun kardinalitinya lebih rendah, adalah lebih cekap untuk ini pertanyaan.
Penjelasan
Pengoptimum MySQL menganalisis alternatif indeks dan memilih yang mempunyai kos terendah. Menggunakan jejak pengoptimum, kita boleh melihat alasan di sebalik pilihan ini.
Untuk fe (masa fail dahulu), MySQL menganggarkan bahawa ia perlu mengimbas 16684 baris untuk mencari fail 'gif', walaupun dengan keadaan julat dihidupkan masa fail.
Untuk ef (ext first), walau bagaimanapun, ia menganggarkan bahawa ia boleh menggunakan kedua-dua lajur indeks dan dengan cepat menelusuri ke baris yang sesuai, menyebabkan kos hanya 646.61. MySQL memilih indeks ini kerana ia boleh menggunakan lebih banyak bahagian penting, menjadikan carian lebih cekap.
Kesimpulan
Atas ialah kandungan terperinci Indeks MySQL manakah yang Lebih Cekap untuk Pertanyaan Julat: Mendahului dengan Lajur Cardinaliti Tinggi atau Rendah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!