在Mysql建立多列索引(聯(lián)合索引)有最左前綴的原則逢勾,即最左優(yōu)先酷宵。
如果我們建立了一個2列的聯(lián)合索引(col1,col2),實際上已經(jīng)建立了兩個聯(lián)合索引(col1)或粮、(col1,col2);
如果有一個3列索引(col1,col2,col3),實際上已經(jīng)建立了三個聯(lián)合索引(col1)朵锣、(col1,col2)谬盐、(col1,col2,col3)。
解釋
1诚些、b+樹的數(shù)據(jù)項是復合的數(shù)據(jù)結(jié)構(gòu)飞傀,比如(name,age,sex)的時候,b+樹是按照從左到右的順序來建立搜索樹的诬烹,比如當(張三,20,F)這樣的數(shù)據(jù)來檢索的時候砸烦,b+樹會優(yōu)先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex绞吁,最后得到檢索的數(shù)據(jù)幢痘;但當(20,F)這樣的沒有name的數(shù)據(jù)來的時候,b+樹就不知道第一步該查哪個節(jié)點家破,因為建立搜索樹的時候name就是第一個比較因子颜说,必須要先根據(jù)name來搜索才能知道下一步去哪里查詢。
2汰聋、比如當(張三,F)這樣的數(shù)據(jù)來檢索時门粪,b+樹可以用name來指定搜索方向,但下一個字段age的缺失烹困,所以只能把名字等于張三的數(shù)據(jù)都找到庄拇,然后再匹配性別是F的數(shù)據(jù)了砰逻, 這個是非常重要的性質(zhì)瓤狐,即索引的最左匹配特性。(這種情況無法用到聯(lián)合索引)
mysql里創(chuàng)建聯(lián)合索引的意義
一個頂三個
建了一個(a,b,c)的復合索引始藕,那么實際等于建了(a),(a,b),(a,b,c)三個索引女淑,因為每多一個索引瞭郑,都會增加寫操作的開銷和磁盤空間的開銷。對于大量數(shù)據(jù)的表鸭你,這可是不小的開銷屈张!
覆蓋索引
同樣的有復合索引(a,b,c)擒权,如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通過遍歷索引取得數(shù)據(jù)阁谆,而無需回表碳抄,這減少了很多的隨機io操作。減少io操作场绿,特別的隨機io其實是dba主要的優(yōu)化策略剖效。所以,在真正的實際應用中焰盗,覆蓋索引是主要的提升性能的優(yōu)化手段之一
索引列越多璧尸,通過索引篩選出的數(shù)據(jù)越少
有1000W條數(shù)據(jù)的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假設(shè)假設(shè)每個條件可以篩選出10%的數(shù)據(jù)熬拒,如果只有單值索引爷光,那么通過該索引能篩選出1000W*10%=100w 條數(shù)據(jù),然后再回表從100w條數(shù)據(jù)中找到符合b=2 and c= 3的數(shù)據(jù)澎粟,然后再排序蛀序,再分頁;如果是復合索引活烙,通過索引篩選出1000w *10% *10% *10%=1w徐裸,然后再排序、分頁瓣颅,哪個更高效倦逐,一眼便知
創(chuàng)建聯(lián)合索引時列的選擇原則
經(jīng)常用的列優(yōu)先(最左匹配原則)
離散度高的列優(yōu)先(離散度高原則)
寬度小的列優(yōu)先(最少空間原則)
列的離散性計算:count(distinct col)/ count(col)
例如:
id列一共9列都不重復 9/9 = 1
性別列一共9列只有(男或者女)兩列 2/9 約等于0.2
離散性越高選擇性越大
轉(zhuǎn)載: