日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql 多列索引的生效规则

發(fā)布時(shí)間:2025/5/22 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 多列索引的生效规则 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
mysql中 myisam,innodb默認(rèn)使用的是 Btree索引,至于btree的數(shù)據(jù)結(jié)構(gòu)是怎樣的都不重要,
只需要知道結(jié)果,既然是索引那這個(gè)數(shù)據(jù)結(jié)構(gòu)最后是排好序;就像新華字典他的目錄就是按照a,b,c..這樣排好序的;
所以你在找東西的時(shí)候才快,比如你找 “中” 這個(gè)字的解釋,你肯定就會(huì)定位到目錄的 z 開(kāi)頭部分;

組合索引可以這樣理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的;


組合索引的生效原則是? 從前往后依次使用生效,如果中間某個(gè)索引沒(méi)有使用,那么斷點(diǎn)前面的索引部分起作用,斷點(diǎn)后面的索引沒(méi)有起作用;
比如

where a=3 and b=45 and c=5 .... 這種三個(gè)索引順序使用中間沒(méi)有斷點(diǎn),全部發(fā)揮作用; where a=3 and c=5... 這種情況下b就是斷點(diǎn),a發(fā)揮了效果,c沒(méi)有效果 where b=3 and c=4... 這種情況下a就是斷點(diǎn),在a后面的索引都沒(méi)有發(fā)揮作用,這種寫(xiě)法聯(lián)合索引沒(méi)有發(fā)揮任何效果; where b=45 and a=3 and c=5 .... 這個(gè)跟第一個(gè)一樣,全部發(fā)揮作用,abc只要用上了就行,跟寫(xiě)的順序無(wú)關(guān)

?


(a,b,c) 三個(gè)列上加了聯(lián)合索引(是聯(lián)合索引 不是在每個(gè)列上單獨(dú)加索引)

還需注意,? (a,b,c)多列索引和 (a,c,b)是不一樣的,看上面的圖也看得出來(lái)關(guān)系順序是不一樣的;
分析幾個(gè)實(shí)際例子來(lái)加強(qiáng)理解;
分析句子中使用的索引情況

(0) select * from mytable where a=3 and b=5 and c=4; abc三個(gè)索引都在where條件里面用到了,而且都發(fā)揮了作用 (1) select * from mytable where c=4 and b=6 and a=3; 這條語(yǔ)句列出來(lái)只想說(shuō)明 mysql沒(méi)有那么笨,where里面的條件順序在查詢之前會(huì)被mysql自動(dòng)優(yōu)化,效果跟上一句一樣 (2) select * from mytable where a=3 and c=7; a用到索引,b沒(méi)有用,所以c是沒(méi)有用到索引效果的 (3) select * from mytable where a=3 and b>7 and c=3; a用到了,b也用到了,c沒(méi)有用到,這個(gè)地方b是范圍值,也算斷點(diǎn),只不過(guò)自身用到了索引 (4) select * from mytable where b=3 and c=4; 因?yàn)閍索引沒(méi)有使用,所以這里 bc都沒(méi)有用上索引效果 (5) select * from mytable where a>4 and b=7 and c=9; a用到了 b沒(méi)有使用,c沒(méi)有使用 (6) select * from mytable where a=3 order by b; a用到了索引,b在結(jié)果排序中也用到了索引的效果,前面說(shuō)了,a下面任意一段的b是排好序的 (7) select * from mytable where a=3 order by c; a用到了索引,但是這個(gè)地方c沒(méi)有發(fā)揮排序效果,因?yàn)橹虚g斷點(diǎn)了,使用 explain 可以看到 filesort (8) select * from mytable where b=3 order by a; b沒(méi)有用到索引,排序中a也沒(méi)有發(fā)揮索引效果

?


補(bǔ)充一個(gè):

快速生成1000W測(cè)試數(shù)據(jù)庫(kù);

創(chuàng)建測(cè)試表:

create table user ( id int(10) not null auto_increment, uname varchar(20) , regtime char(30) , age int(11) ,primary key (id) ) engine=myisam default charset=utf8 collate=utf8_general_ci , auto_increment=1 ;

?

編寫(xiě)存儲(chǔ)過(guò)程:

delimiter $$ SET AUTOCOMMIT = 0$$create procedure test() begin declare v_cnt decimal (10) default 0 ; dd:loopinsert into user values(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50),(null,rand()*10,now(),rand()*50);commit;set v_cnt = v_cnt+10 ;if v_cnt = 10000000 then leave dd;end if;end loop dd ; end;$$delimiter ;

?

調(diào)用存儲(chǔ)過(guò)程:

call test();

總結(jié)

以上是生活随笔為你收集整理的mysql 多列索引的生效规则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。