mysql建立多列索引(聯合索引)有最左字首的原則,即最左優先,如:
如果有乙個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上建立了索引;
如果有乙個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;
總結:1、b+樹的資料項是復合的資料結構,比如(name,age,***)的時候,b+樹是按照從左到右的順序來建立搜尋樹的,比如當(張三,20,f)這樣的資料來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和***,最後得到檢索的資料;但當(20,f)這樣的沒有name的資料來的時候,b+樹就不知道第一步該查哪個節點,因為建立搜尋樹的時候name就是第乙個比較因子,必須要先根據name來搜尋才能知道下一步去**查詢。
2、比如當(張三,f)這樣的資料來檢索時,b+樹可以用name來指定搜尋方向,但下乙個欄位age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是f的資料了, 這個是非常重要的性質,即索引的最左匹配特性。(這種情況無法用到聯合索引)
"乙個頂三個"。建了乙個(a,b,c)的復合索引,那麼實際等於建了(a),(a,b),(a,b,c)三個索引,因為每多乙個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量資料的表,這可是不小的開銷!
覆蓋索引。同樣的有復合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那麼mysql可以直接通過遍歷索引取得資料,而無需回表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提公升效能的優化手段之一
索引列越多,通過索引篩選出的資料越少。有1000w條資料的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假設假設每個條件可以篩選出10%的資料,如果只有單值索引,那麼通過該索引能篩選出1000w*10%=100w 條資料,然後再回表從100w條資料中找到符合b=2 and c= 3的資料,然後再排序,再分頁;如果是復合索引,通過索引篩選出1000w *10% *10% *10%=1w,然後再排序、分頁,哪個更高效,一眼便知
mysql 最左匹配 聯合索引
mysql建立多列索引 聯合索引 有最左字首的原則,即最左優先,如 如果有乙個2列的索引 col1,col2 則已經對 col1 col1,col2 上建立了索引 如果有乙個3列索引 col1,col2,col3 則已經對 col1 col1,col2 col1,col2,col3 上建立了索引 總...
Mysql 聯合索引最左匹配原則
二 測試現象 drop table if exists test table create table test table id int 11 not null auto increment comment 編號 namee varchar 255 default null comment 姓名 ...
簡述MySQL聯合索引最左匹配原則
在網上看過一些有關最左匹配原則的部落格,自以為自己理解了,但是今天面試的時候被面試官深挖了一下,就暴露了其實並沒有真正理解到最左匹配原則。mysql在建立聯合索引的時候,會從左到右依次建立遞增的索引。而且也比較推薦建立聯合索引,因為乙個索引可以起到很多個索引的作用。create table inde...