索引:幫助MySQL高效獲取數據是排序好的數據結構
索引數據結構:二叉樹、紅黑樹、Hash表、B-Tree
MySQL數據結構B+樹
數據庫中不同的表可能有不同的存儲引擎
MylSAM存儲引擎索引文件(MYI文件)和數據文件(MYD文件數據存放地址)是分離的(非聚集)
InnoDB存儲引擎索引實現(聚集)(支持事務)
表結構(frm文件)和索引數據(ibd)
1、表數據文件本身就是按b+樹組織的一個索引結構文件
2、聚集索引-葉節點包含了完整的數據結構
3、爲什麼InnoDB表必須有主鍵,並且推薦使用整型的自增主鍵
如果沒有主鍵或者默認使用uuid作爲主鍵會使索引重複,導致b+樹重新分叉的情況,消耗性能
4、爲什麼非主鍵索引結構葉子節點存儲的是主鍵值?(一致性和節省存儲空間)
一、二叉樹
在排好序的遞增序列如1,2,3...這樣的序列中沒有用
二、紅黑樹
自平衡二叉樹,當數據過大如千萬級最壞需要23次磁盤io
hash表:索引方法除了b+樹外還有hash表
hash算法MD5、CRC16等
hash對範圍查找無能爲力
三、B樹
- 節點具有相同的深度,葉節點的指針爲空
- 所有索引元素不重複
- 節點中的數據索引從左到右遞增排列
四、B+樹(B樹的變種)
1、B+樹的概念
可最多存放1142*1142*16大約2000多萬行數據
一個葉子節點16KB,索引用bigint類型存儲大小8B,指針大小6B,故存儲索引大小約爲14B
16KB/14B=1142
2、B+樹的特點
- 非葉子節點不存儲data,只存儲索引,可以放更多的數據
- 葉子節點不存儲指針(葉子節點採用鏈表存儲)
- 順序訪問指針,提高區間訪問的性能