Mari kita mulakan dengan perkara yang pelik:
Biar saya buat beberapa data untuk menghasilkan semula masalah dan buat jadual pengguna:
CREATE TABLE `user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT 0 COMMENT '年龄', PRIMARY KEY (`id`), KEY `idx_age` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Soal maklumat pengguna umur ini melalui kumpulan umur pengguna dan semak pelan pelaksanaan SQL:
explain select * from user where age in (1,2,3,4,5,6,7,8,9);
di mana keadaan mempunyai 9 Parameter, fokus pada anggaran bilangan baris yang diimbas dalam pelan pelaksanaan, iaitu 279 baris.
Tiada masalah di sini, anggarannya sangat tepat, ia sebenarnya 279 baris.
Namun, masalah timbul Apabila kita menambah parameter lain pada keadaan di mana, ia menjadi 10 parameter Anggaran bilangan garisan yang diimbas sepatutnya meningkat ia telah dikurangkan dengan banyak.
explain select * from user where age in (1,2,3,4,5,6,7,8,9,10);
Ia tiba-tiba dikurangkan kepada 30 baris, tetapi berapakah bilangan baris sebenar?
Nombor sebenar ialah 310 baris, dan anggaran bilangan baris yang diimbas ialah 30 baris. Saya benar-benar salah.
Apa yang berlaku dengan MySQL? Bolehkah ia dianggarkan?
Jika anda tidak dapat meramalkannya, gunakan orang lain!
Mesti semua orang keliru, sehingga saya pergi ke laman web rasmi dan melihat satu perkataan, Selam indeks .
Berkaitan dengan perkataan ini, terdapat juga parameter konfigurasi eq_range_index_dive_limit.
Untuk versi sebelum MySQL5.7.3, nilai ini lalai kepada 10, dan untuk versi seterusnya, nilai ini lalai kepada 200.
Anda boleh menggunakan arahan untuk menyemak saiz nilai ini:
show variables like '%eq_range_index_dive_limit%';
Sudah tentu, kita juga boleh ubah suai nilai ini secara manual Saiz:
set eq_range_index_dive_limit=200;
Ini eq_range_index_dive_limit Fungsi konfigurasi ialah:
Apabila bilangan parameter dalam pernyataan di mana dalam keadaan adalah kurang daripada nilai ini, MySQL akan menggunakan Selam indeks menganggarkan bilangan baris yang diimbas, yang sangat tepat.
Apabila bilangan parameter dalam keadaan pernyataan where adalah lebih besar daripada atau sama dengan nilai ini, MySQL menggunakan kaedah lain Statistik indeks (Statistik indeks) untuk menganggarkan bilangan yang diimbas baris, dengan ralat yang besar .
Mengapa MySQL melakukan ini?
semua menggunakan Selam indeks untuk menganggarkan bilangan baris yang diimbas, bukankah ia bagus?
Malah, ini berdasarkan pertimbangan kos Selam indeksAnggaran kos lebih tinggi dan ia sesuai untuk volum data yang kecil. Statistik indeksAnggaran kos adalah rendah dan sesuai untuk volum data yang besar.
Secara amnya, keadaan pernyataan where kami tidak mempunyai terlalu banyak parameter, jadi adalah sesuai untuk menggunakan selam indeks untuk menganggarkan bilangan baris yang diimbas.
Adalah disyorkan bahawa pelajar yang masih menggunakan versi sebelum MySQL5.7.3 secara manual mengubah suai parameter konfigurasi selam indeks kepada nilai yang sesuai.
Jika dalam keadaan dalam projek anda mempunyai sehingga 500 parameter, tukar parameter konfigurasi kepada 501.
Dengan cara ini, MySQL menganggarkan bilangan baris yang diimbas dengan lebih tepat dan boleh memilih indeks yang lebih sesuai.
Atas ialah kandungan terperinci Analisis contoh menyelam indeks untuk pengoptimuman prestasi pertanyaan MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!