mysql索引本質


一、索引幫助mysql高效獲取數據排好序的數據結構。

二、索引存儲位置:磁盤文件。

三、索引結構:二叉樹、紅黑樹、hash、BTree、B+Tree 。索引結構為了更快找到目標數據。

四、數據結構

4.1、二叉樹

定義:每個結點最多有兩個子樹,左子樹比父節點小,右子樹比父節點大。

缺點:會出現極端情況導致整棵樹只有左子樹或只有右子樹。

圖:

 

4.2、紅黑樹

定義:

性質1. 節點是紅色或黑色。
性質2. 根節點是黑色。
性質3 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
性質4. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

缺點:數據量大會導致樹層數比較多,這樣就會造成查找數據慢。

圖:

 

4.3、hash數據結構

定義:散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。 對目標值進行hash運算得到hash值和數據磁盤指針地址保存到hash表,這樣就達到快速定位數據位置。

缺點:精確查找十分快速,但范圍查找就碰壁了。

圖:無

4.4、BTree

定義:一個節點可以存儲多個數據,這樣可以避免黑紅樹的缺點,樹的層數很變小。  

缺點:  節點里面數組數據:每個數據的結構=索引數據+數據記錄(即葉子節點存儲鍵值和數據記錄)。

圖:

 

4.5、B+Tree

定義:B+Tree是在B-Tree基礎上的一種優化。節點里面數組數據:每個數據只存儲鍵信息,這樣不存數據可以騰出空間放更多的鍵信息,讓樹層數越小。

  • 非葉子節點只存儲鍵信息。
  • 所有葉子節點之間都有一個鏈指針。
  • 數據記錄都存放在葉子節點中。

缺點:無

 圖:

 

五、mysql采用B+Tree數據結構存儲數據

5.1、B+TREE葉子節點指針作用:定位值比它大的葉子節點。

5.2、引申出為什么mysql "!="或者“<>” 不走索引。從下圖可以知道原因,因為B樹的左節點是比右節點小,而且節點有指針很快能找到范圍的數據,B樹特性+指針的配合這樣可以快速找到指定范圍數據。

圖:

六、mysql為什么用整型自增作為索引比較好。而UUID作為索引效率比較低?

  • 索引存儲在磁盤,而且樹的每個節點分配的空間有大小。整型占空間比較小,這樣可以存放多個鍵值。反之然后UUID占空間比較大。
  • 整型比較方便,UUID比較需要先轉成ASCII在進行比較

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM