mysql 最左匹配 聯合索引

 

mysql創建多列索引(聯合索引)有最左前綴的原則,即最左優先,如:php

若是有一個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上創建了索引;
若是有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)、(col1,col2,col3)上創建了索引;mysql

總結:
一、b+樹的數據項是複合的數據結構,好比(name,age,sex)的時候,b+樹是按照從左到右的順序來創建搜索樹的,好比當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來肯定下一步的所搜方向,若是name相同再依次比較age和sex,最後獲得檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道第一步該查哪一個節點,由於創建搜索樹的時候name就是第一個比較因子,必需要先根據name來搜索才能知道下一步去哪裏查詢。git

二、好比當(張三,F)這樣的數據來檢索時,b+樹能夠用name來指定搜索方向,但下一個字段age的缺失,因此只能把名字等於張三的數據都找到,而後再匹配性別是F的數據了, 這個是很是重要的性質,即索引的最左匹配特性。(這種狀況沒法用到聯合索引)github

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

mysql裏建立‘聯合索引’的意義?

  1. "一個頂三個"。建了一個(a,b,c)的複合索引,那麼實際等於建了(a),(a,b),(a,b,c)三個索引,由於每多一個索引,都會增長寫操做的開銷和磁盤空間的開銷。對於大量數據的表,這但是不小的開銷!
  2. 覆蓋索引。一樣的有複合索引(a,b,c),若是有以下的sql: select a,b,c from table where a=1 and b = 1。那麼MySQL能夠直接經過遍歷索引取得數據,而無需回表,這減小了不少的隨機io操做。減小io操做,特別的隨機io實際上是dba主要的優化策略。因此,在真正的實際應用中,覆蓋索引是主要的提高性能的優化手段之一
  3. 索引列越多,經過索引篩選出的數據越少。有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,而後再排序、分頁,哪一個更高效,一眼便知

 

 

ref: sql

https://github.com/phpforlan/ArtisanPHP/issues/10segmentfault

https://segmentfault.com/q/1010000000342176數據結構

相關文章
相關標籤/搜索