Rumah > Artikel > pangkalan data > Apakah prinsip awalan paling kiri bagi indeks Mysql?
Sebab mengapa terdapat indeks awalan paling kiri ini
Dalam analisis akhir, ia adalah struktur pangkalan data B+ tree mysql
Dalam masalah praktikal, seperti
Indeks indeks (a, b, c) mempunyai tiga medan
menggunakan pernyataan pertanyaan select * from table where c = '1'
Penyataan SQL tidak akan menggunakan
select * from table where b =‘1’ and c ='2'
pernyataan indeks indeks Ia tidak akan menggunakan indeks indeks
prinsip padanan awalan paling kiri: Apabila MySQL membina indeks bersama, ia akan mengikut. Prinsip padanan awalan paling kiri, iaitu, keutamaan paling kiri, apabila mendapatkan data Mulakan padanan dari bahagian paling kiri indeks bersama
Untuk mengenal pasti situasi ini dengan lebih baik, analisis situasi mencipta jadual dan indeks
Buat jadual dan buat indeks bersama Jika susunan diterbalikkan, ia masih boleh dikenal pasti, tetapi semua bahagiannya mesti disertakan
Buat. jadual
CREATE TABLE staffs( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(24) NOT NULL DEFAULT'' COMMENT'姓名', `age` INT NOT NULL DEFAULT 0 COMMENT'年龄', `pos` VARCHAR(20) NOT NULL DEFAULT'' COMMENT'职位', `add_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT'入职时间' )CHARSET utf8 COMMENT'员工记录表'; INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES('z3',22,'manager',NOW()); INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES('July',23,'dev',NOW()); INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES('2000',23,'dev',NOW());
Buat indeksALTER TABLE staffs ADD INDEX index_staffs_nameAgePos(name,age,pos);
Bit tertib indeks name-age-pos
menunjukkan sama ada indeksnya mempunyai show index from staffs;
Dengan membalikkan susunan kiri dan kanannya, pelaksanaannya akan menjadi sama
Ayat utama ialah tiga ayat ini
explain select *from staffs where name='z3'and age=22 and pos='manager';
explain select *from staffs where pos='manager' and name='z3'and age=22;
explain select *from staffs where age=22 and pos='manager' and name='z3';
explain select *from staffs where name=‘z3’;
explain select *from staffs where name='z3’and age=22;
explain select *from staffs where name='z3’and age=22;
explain select *from staffs where name='z3';
explain select *from staffs where name='z3' and pos='manager';
explain select *from staffs where pos='manager';
, tetapi jika anda hanya menanyakan jenis indeks terakhir ialah jenis semua, dan keseluruhan jadual akan ditanya secara langsung (ini kerana tiada padanan dari permulaan nama, dan jika ia secara langsung sepadan dengan pos, ia akan dipaparkan Tidak Tertib,)Kadangkala jenis ialah jenis indeks, kerana ia masih boleh disoal melalui indeksindeks mengimbas semua pokok indeks, sementara semua mengimbas data pada keseluruhan cakera Imbasan jadual penuh 4 Indeks kabur Sama seperti indeks kabur, pernyataan seperti digunakan, jadi tiga pernyataan berikut jika komposit adalah paling kiri Untuk awalan, jenis julat atau indeks akan digunakan untuk pengindeksan
Indeks awalan paling kiri, jenisnya ialah indeks atau julatexplain select *from staffs where name like '3%';
Jenisnya semua, pertanyaan keseluruhan jadualexplain select *from staffs where name like '%3%';
, jenisnya semua, pertanyaan jadual keseluruhanexplain select *from staffs where name like '%3%';
建立一张单表
CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, author_id INT(10) UNSIGNED NOT NULL, category_id INT(10) UNSIGNED NOT NULL, views INT(10) UNSIGNED NOT NULL, comments INT(10) UNSIGNED NOT NULL, title VARCHAR(255) NOT NULL, content TEXT NOT NULL ); INSERT INTO article(author_id,category_id,views,comments,title,content) VALUES (1,1,1,1,'1','1'), (2,2,2,2,'2','2'), (1,1,3,3,'3','3');
经过如下查询:
explain SELECT id, author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
发现其上面的单表查询,不是索引的话,他是进行了全表查询,而且在extra还出现了Using filesort等问题
所以思路可以有建立其复合索引
具体建立复合索引有两种方式:
create index idx_article_ccv on article(category_id,comments,views);
ALTER TABLE 'article' ADD INDEX idx_article_ccv ( 'category_id , 'comments', 'views' );
但这只是去除了它的范围,如果要去除Using filesort问题的话,还要将其中间的条件范围改为等于号才可满足
发现其思路不行,所以删除其索引 DROP INDEX idx_article_ccv ON article;
主要的原因是:
这是因为按照BTree索引的工作原理,先排序category_id,如果遇到相同的category_id则再排序comments,如果遇到相同的comments 则再排序views。
当comments字段在联合索引里处于中间位置时,因comments > 1条件是一个范围值(所谓range),MySQL无法利用索引再对后面的views部分进行检索,即range类型查询字段后面的索引无效。
所以建立复合索引是对的
但是其思路要避开中间那个范围的索引进去
只加入另外两个索引即可create index idx_article_cv on article(category_id, views);
Atas ialah kandungan terperinci Apakah prinsip awalan paling kiri bagi indeks Mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!