1.mysql索引的數據結構及使用

1.索引所用的數據結構

目前常用的數據庫爲mysql數據庫以innodb爲引擎所建的表,對於這種情況,95%以上的情況使用的是B+Tree索引結構。

B+樹是對B樹的一種變形樹,它與B樹的差異在於:
有k個子結點的結點必然有k個關鍵碼;
非葉結點僅具有索引作用,跟記錄有關的信息均存放在葉結點中。
樹的所有葉結點構成一個有序鏈表,可以按照關鍵碼排序的次序遍歷全部記錄。
如下圖,是一個B+樹:
在這裏插入圖片描述
B和B+樹的區別在於,B+樹的非葉子結點只包含導航信息,不包含實際的值,所有的葉子結點和相連的節點使用鏈表相連,便於區間查找和遍歷。
B+ 樹的優點在於:
由於B+樹在內部節點上不包含數據信息,因此在內存頁中能夠存放更多的key。 數據存放的更加緊密,具有更好的空間局部性。因此訪問葉子節點上關聯的數據也具有更好的緩存命中率。
B+樹的葉子結點都是相鏈的,因此對整棵樹的便利只需要一次線性遍歷葉子結點即可。而且由於數據順序排列並且相連,所以便於區間查找和搜索。而B樹則需要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,所以緩存命中性沒有B+樹好。

2.索引的優點

衆所周知,對磁盤的IO操作消耗遠大於對內存IO(差距通常達到成千上萬倍),索引可以讓服務器快速定位到表的指定位置,以B+Tree索引爲例,按照順序存儲數據,所以Mysql可以用索引來做order by和group的操作。因爲數據是有序的,所以B+Tree也會把相關的列值存儲在一起。又因爲索引中存儲了實際的列值,所以對於某些查詢來說,只使用索引就可以完成全部查詢工作。總結下來,索引有以下三個優點:

  • 索引極大減少了服務器需要掃描的數據量。
  • 索引可以幫助服務器避免排序和臨時表。
  • 索引可以將隨機IO變成有序IO。

3.索引的成本和性價比計算

索引的成本也就是需要維護這麼一個B+Tree,本身插入和刪除數據的過程也需要增加維護B+Tree的開銷。
如果字段毫無區分度,那麼這個索引實際上也並無什麼使用價值,所以說索引的NPV計算與下列數據均有相關性

  • 使用索引的頻率
  • 使用索引節省下的成本
  • 對於查詢的延遲敏感度
  • 增刪的頻率
  • 增刪時維護索引的成本
  • 對於增刪的延遲敏感度
    大體來看,可以這麼簡略的計算
    NPV = 對於查詢的延遲敏感度 X 使用索引的頻率 X 使用索引節省下的成本 - 對於增刪的延遲敏感度 X 增刪的頻率 X 增刪時維護索引的成本

4.有效的使用索引

由以上公式可得出,建立索引應當滿足以下原則

4.1 建立索引的原則:

  • 比起增刪來說,查詢的頻率很高
  • 比起增刪的延遲時間來說,用戶更在意查詢的延遲時間
  • 使用索引節省下的成本應儘量高
  • 維護索引的成本應儘量低

4.2 使用索引需要注意的點:

  • 最左前綴匹配原則

    select * from s1 where name=‘egon’; #可以
    select * from s1 where name=‘egon’ and email=‘asdf’; #可以
    select * from s1 where email=‘[email protected]’; #不可以

    mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,
    比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,
    d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

  • =和in可以亂序
    比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器
    會幫你優化成索引可以識別的形式

  • 儘量選擇區分度高的列作爲索引,一般以區分度0.1左右爲標準
    使用索引限制前綴時應反覆計算,區分度也不宜太高

  • 索引列不能參與計算
    這樣每一個元素都會計算,查詢成本會急劇升高

  • 避免使用select *
    這樣會導致索引無法覆蓋需要查詢的列

  • like %xxx
    這種形式無法使用索引,而like xxx%則可以

  • 排序條件爲索引,則select字段必須也是索引字段,否則無法命中
    如果排序條件爲主鍵也會走索引

  • !=條件不會使用索引
    如果條件爲主鍵也會走索引

  • 組合索引代替多個單列索引(經常使用多個條件查詢時)
    視具體業務條件確定

  • 儘量使用短索引

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章