一、索引幫助mysql高效獲取數據排好序的數據結構。
二、索引存儲位置:磁盤文件。
三、索引結構:二叉樹、紅黑樹、hash、BTree、B+Tree 。索引結構為了更快找到目標數據。
四、數據結構
4.1、二叉樹
定義:每個結點最多有兩個子樹,左子樹比父節點小,右子樹比父節點大。
缺點:會出現極端情況導致整棵樹只有左子樹或只有右子樹。
圖:

4.2、紅黑樹
定義:
缺點:數據量大會導致樹層數比較多,這樣就會造成查找數據慢。
圖:

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在進行比較
