mysql 多列索引的生效规则
生活随笔
收集整理的這篇文章主要介紹了
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都是排好序的;
只需要知道結(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)有起作用;
比如
?
(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)理解;
分析句子中使用的索引情況
?
補(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)題。
- 上一篇: 建设银行转人工服务怎么输入
- 下一篇: swoole 异步MYSQL