mysql 聯(lián)合索引

聯(lián)合索引使用規(guī)則

問題:

假設(shè)某個表有一個聯(lián)合索引(c1,c2,c3,c4)以下只能使用該聯(lián)合索引的c1,c2,c3部分

A where c1=x and c2=x and c4>x and c3=x

B where c1=x and c2=x and c4=x order by c3

C where c1=x and c4= x group by c3,c2

D where c1=? and c5=? order by c2,c3

E where c1=? and c2=? and c5=? order by c2,c3

一弊决、創(chuàng)建測試表和聯(lián)合索引

創(chuàng)建表t1刽宪,有c1到c5共5個字段,特別說明一下,字段類型都是定長char(1) 類型握联,并且非空苔严,字符集是utf8(與計算索引使用字節(jié)數(shù)有關(guān))。

create table t1(

c1 char(1) not null default '',

c2 char(1) not null default '',

c3 char(1) not null default '',

c4 char(1) not null default '',

c5 char(1) not null default ''

)engine myisam charset utf8;

?創(chuàng)建聯(lián)合索引:

alter table t1 add index c1234(c1,c2,c3,c4);

插入3條數(shù)據(jù):

insert into t1 values('a','b','c','d','e'),('A','b','c','d','e'),('a','B','c','d','e');

?二蟀瞧、分析

1沉颂、A選項


我們看解析A這條sql的結(jié)果条摸,與索引有關(guān)的主要是possible_keys,key,key_len這三項,possible_keys是指可能會用到的索引铸屉,key是當前sql使用到的索引钉蒲,key_len是索引的使用字節(jié)數(shù)。key的值是c1234表示聯(lián)合索引用上了彻坛,那是不是c1,c2,c3,c4全用上了咧顷啼,我們得從key_len分析一下。

? ? 因為字段類型是char(1)昌屉,字符集是utf8钙蒙,所以每個字段的key_len 是

1*3=3,key_len現(xiàn)在等于12表示c1,c2,c3,c4這四個字段都用上了索引间驮,(如果字段類型是null仪搔,那單個字段的索引字節(jié)數(shù)需要

+1,如果字段類型為非定長類型蜻牢,比如varchar烤咧,那字節(jié)數(shù)需要再 +2,這里方便理解抢呆,統(tǒng)一定義成了定長char)

2煮嫌、B選項


我們看到key=c1234,表示B使用了聯(lián)合索引抱虐,key_len=6表示有兩個字段使用了索引昌阿,這兩個字段就是C1和c2,這個sql里面有一個order

by c3恳邀,order by不能使用索引懦冰,但是卻利用了索引,為什么這么說咧谣沸,如果我們改成order by c5刷钢,看下面的:

? ? 與上面的結(jié)果對比,發(fā)現(xiàn)在Extra中的值使用了Using filesort乳附。Using

filesort表示在索引之外内地,需要額外進行外部的排序動作。因為c5的順序是沒有規(guī)律的赋除,所以需要對其進行一次排序阱缓,而在order by

c3的時候,c3其實在索引表里面已經(jīng)是排好序的了举农,不需要再排序荆针,所以說其實他利用上了索引。

3、C選項

key=c1234航背,表示B使用了聯(lián)合索引秸妥,key_len=3表示有1個字段使用了索引,這個字段就是C1沃粗,與B語句不一樣的是 Extra的值粥惧,C語句里面使用了臨時表(Using temporary) 和 排序(filesort),因為組合索引是需要按順序執(zhí)行的最盅,比如c1234組合索引突雪,要想在c2上使用索引,必須先在c1上使用索引涡贱,要想在c3上使用索引咏删,必須先在c2上使用索引,依此類推问词《胶回到B語句中,因為c2字段已經(jīng)使用了索引激挪,所以在order by c3的時候 c3其實在索引表里面已經(jīng)是排好序的了辰狡,不需要建臨時表,不需要再排序垄分,所以說其實他利用上了索引宛篇。

而C語句中,group by 的順序是先c3薄湿,再c2叫倍,在對c3進行g(shù)roup by的時候,c2字段上的索引并沒用使用豺瘤,所以索引在這里就斷了吆倦,只用上了c1一個字段的索引。

如果group by 的順序改成c2,c3坐求,會是什么樣蚕泽?

從結(jié)果中看沒有用到臨時表和filesort,因為c2,c3在索引表中本身就是有序的瞻赶。

4赛糟、D選項


從結(jié)果中看到key=c1234,表示B使用了聯(lián)合索引砸逊,key_len=3表示有一個字段使用了索引,即C1字段掌逛。而c2师逸,c3字段在order

by中是順序執(zhí)行,所以也利用了索引豆混。這里沒有使用filesort就是因為c2篓像,c3本身在索引表中就是有序的动知,所以不需要對其再排序。那如果反之员辩,先按c3排序盒粮,再按c2排序,會是什么情況奠滑,看下面:

從結(jié)果中看到使用了filesort丹皱,這里就無法合理的使用索引了。舉個例子來說宋税,好比中國下的省是有序的摊崭,如果按照先找國家再找省那自然是順序的,而如果反過來杰赛,先找省再找國家呢簸,那肯定是亂序的,自然也就不能利用索引了乏屯。

5根时、E選項

E語句c1和c2使用了索引,c3在order by中利用了索引辰晕。如果再反之啸箫,先按c3排序,再按c2排序會是什么情況伞芹?

order by c3,c2忘苛,按理說應(yīng)該使用filesort,但從結(jié)果中看并沒有使用唱较,這是為什么呢扎唾?注意仔細看查詢條件,c1='a'

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末南缓,一起剝皮案震驚了整個濱河市胸遇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汉形,老刑警劉巖纸镊,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異概疆,居然都是意外死亡逗威,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門岔冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凯旭,“玉大人,你說我怎么就攤上這事」藓簦” “怎么了鞠柄?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫉柴。 經(jīng)常有香客問我厌杜,道長,這世上最難降的妖魔是什么计螺? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任夯尽,我火速辦了婚禮,結(jié)果婚禮上危尿,老公的妹妹穿的比我還像新娘呐萌。我一直安慰自己,他們只是感情好谊娇,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布肺孤。 她就那樣靜靜地躺著,像睡著了一般济欢。 火紅的嫁衣襯著肌膚如雪赠堵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天法褥,我揣著相機與錄音茫叭,去河邊找鬼。 笑死半等,一個胖子當著我的面吹牛揍愁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杀饵,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莽囤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了切距?” 一聲冷哼從身側(cè)響起朽缎,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谜悟,沒想到半個月后话肖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳍烁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡是钥,死狀恐怖掠归,靈堂內(nèi)的尸體忽然破棺而出缅叠,到底是詐尸還是另有隱情悄泥,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布肤粱,位于F島的核電站弹囚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏领曼。R本人自食惡果不足惜鸥鹉,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庶骄。 院中可真熱鬧毁渗,春花似錦、人聲如沸单刁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羔飞。三九已至肺樟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逻淌,已是汗流浹背么伯。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卡儒,地道東北人田柔。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像骨望,于是被迫代替她去往敵國和親硬爆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一锦募、什么是聯(lián)合索引 兩個或更多個列上的索引被稱作聯(lián)合索引摆屯,聯(lián)合索引又叫復合索引。對于復合索引:Mysql從左到右的...
    Ferrari1001閱讀 50,731評論 2 13
  • 索引:排好序利于快速查找的數(shù)據(jù)結(jié)構(gòu)(Btree) explain/show profile1糠亩、typeall - ...
    換煤氣哥哥閱讀 531評論 0 0
  • 前言 之前看了很多關(guān)于MySQL索引的文章也看了《高性能MySQL》這本書虐骑,自以為熟悉了MySQL索引使用原理,入...
    PHP菜雞閱讀 3,432評論 0 1
  • 前言 之前在網(wǎng)上看到過很多關(guān)于mysql聯(lián)合索引最左前綴匹配的文章赎线,自以為就了解了其原理廷没,最近面試時和面試官交流,...
    AI喬治閱讀 1,969評論 3 9
  • “我認識她啊垂寥,她顧我來給她奶奶干活颠黎,那老太婆癱了另锋。從不說話∠凉椋可是她最近往家里寄了一筆很多的錢回來夭坪,也沒寄一封...
    夕木君閱讀 224評論 0 1