爲什麼mysql索引要用B+Tree數據結構

數據結構比較

二叉樹

         不適合自增長索引,失去索引效率,樹單邊增長,成鏈表狀。

         

            (從1插入到4)

紅黑樹(平衡二叉樹)

          不適合數據量大,樹太高。如果查找數據在葉子節點,則需要查樹高次數。

        

           (從1插入到5)

hash表

         hash衝突,並且不支持範圍查詢,大於小於區間查詢。

        mysql支持,等於查詢能快速定位,只適合數據量特別大,範圍查詢很少,性能要求很高場景。

B+Tree

       data放在葉子節點, 非葉子節點不存data,只存索引,可以放更多的索引,順時針訪問指針,提高了區間訪問性能。

        支持範圍查詢,左節點比父節點小,右節點比父節點大,並且葉子節點有雙向地址指針定位。

         

B-Tree

         非葉子節點帶data,增加了每次IO的內存佔用。

       沒有B+Tree葉子節點的指針,不方便範圍查詢。

 

注:1.樹結構默認左節點小於父節點,右節點大於父節點。

     2.mysql庫中表沒有建主鍵索引會默認自己找一個唯一字段建索引,如果沒有會新建一個字段維護一個索引結構在後臺。

         所以建表時應建主鍵索引,而建立自增的主鍵索引可以減少葉子節點的變動,有利於索引維護。

      

索引類型

       主鍵索引(唯一 非空)

       普通索引  ()

       唯一索引 (唯一 可有一空)

        全文索引  

        組合索引  (兩個或者多個字段索引)

當爲普通索引時,先查普通索引找到主鍵,然後再根據主鍵查整行數據(回表)

             select * from member where name = 'lili'     (回表)

             select id from member where name ='lili'    不用回表直接取出

 

當爲組合索引時,滿足最左匹配原則 ,即組合索引左邊的要先滿足,才能滿足右邊索引。

          (name ,age)

       select  * from member where name ='lili'  and age =1      (滿足)

        select  * from member where name ='lili'    (滿足)

         select  * from member where age =1      (不滿足)

          select  * from member where age =1 and name ='lili'    (優化器把條件調換位置  ,滿足)

mysql全文索引一般不用,一般會用es等進行全文索引。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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