一、 二叉搜索樹(Binary Search Tree)java
二叉搜索樹是每一個節點最多有兩個子節點的樹,按照右側子節點大於本節點,左側子節點小於本節點的規律排列,能夠用做搜索,結構以下圖所示
二叉樹雖然能夠用於查找,但在某種特定狀況下查找效率並不高,相似於下圖:
二、紅黑樹mysql
對於二叉樹的缺點,紅黑樹是一種擁有自平衡屬性的二叉樹,紅黑樹有五個特性:sql
- 每一個結點是黑色或者紅色。
- 根結點是黑色。
- 每一個葉子結點(NIL)是黑色。 [注意:這裏葉子結點,是指爲空(NIL或NULL)的葉子結點!不是有值的最後一個節點。]
- 不能有兩個相連的紅色節點。
- 每一個結點到葉子結點NIL所通過的黑色結點的個數同樣的。
根據以上五種屬性,紅黑樹生成時採用左旋,右旋,左右旋,右坐旋等才作,會生成出一顆相對平衡的二叉樹,以下圖
數據庫
三、Hash表數據結構
Hash表相似於java中的hashMap,把索引列作hash映射後以KV結構存儲在內存中,是精準查找最快的索引結構,只須要一次hash即可以定位,但不支持範圍查找。
就是個K-V結構,不畫圖了
四、B-Tree性能
因爲數據庫要存儲大量的數據,若是採用二叉樹進行查找,數據量過大時二叉樹的層級過多,須要由上到下進行查找效率過慢,因此出現了B-Tree,BTree有以下特徵
·葉節點具備相同的深度
·葉節點的指針爲空
·全部索引元素不重複
·節點中的數據索引從左到右遞增排列
數據結構直接上圖
五、B+Tree優化
不過mysql真正採用的不是BTree,Btree在作索引的時候有些地方並非很實用,最終優化出了B+tree做爲mysql innoDB存儲類型的索引,B+tree的特徵以下spa
- 非葉子節點不存儲data,只存儲索引(冗餘)
- 能夠放更多的索引
- 葉子節點包含全部索引字段
- 葉子節點用指針鏈接,提升區間訪問的性能
結構以下圖3d
PS:innoDB中的主鍵索引的B+tree是彙集索引,葉子結點直接存儲的其餘字段的值,用於減小IO的次數,而輔助索引的葉子結點則是存儲的主鍵的值,用於輔助查找
1:MyISAM存儲引擎索引實指針
MyISAM的索引和數據文件是分開的(非彙集索引),索引的葉子節點存儲的是數據的物理地址,查找到相關索引後再用索引去硬盤上查找數據
![]()
2:InnoDB存儲引擎索引實現
InnoDB的索引是和數據存儲在一塊兒的(彙集索引),葉子結點中存儲了全部其餘字段的值,只須要一次加載葉子結點的IO進行索引匹配,匹配成功後不須要再次進行IO操做讀取對應的數據
--表數據文件自己就是按B+Tree組織的一個索引結構文件
--非主鍵索引結構葉子節點存儲主鍵值的緣由是爲了一致性和節省存儲空間
![]()
3: 聯合索引的底層存儲結構
聯合索引是根據索引創建時字段的排列順序創建的索引,後續索引是對第一個字段索引的再劃分,差找時若是不能保證按照索引簡歷時的順序進行查詢,則聯合索引失效
![]()