一、索引模型
1、索引的作用:
索引的出現其實是為了提高數據查詢的效率,就像書的目錄一樣
提高數據查詢效率
2、索引模型的優缺點比較

二、InnoDB索引模型
1、二叉樹是搜索效率最高的,但是實際上大多數的數據庫存儲卻並不適用二叉樹?
1、其原因是,索引不止在內存中,還要寫到磁盤上
2、N叉樹由於在讀寫上的性能優點,以及適配磁盤的訪問模式,已經被廣泛應用在數據庫引擎中了
3、數據庫底層存儲的核心就是基於這些數據模型的,每碰到一個新數據庫,我們需要先關注它的數據模型,這樣才能從離亂山給分析出數據庫的適應場景
4、不同存儲引擎的索引的工作方式並不一樣,而即使多個存儲引擎支持同一類型的索引,其底層的實現也可能不同
由於InnoDB存儲引擎在MySQL數據庫中使用最為廣泛,所以下面我就以為例,和你分析一下其中的索引模型

2、索引類型
主鍵索引:主鍵索引的葉子節點存的是整行的數據(聚簇索引),
非主鍵索引:非主鍵索引的葉子節點內容是主鍵的值(二級索引)
3、主鍵索引和普通索引的區別:
1、主鍵索引只要搜索ID這個B+Tree即可拿到數據。
如果語句是 select * from T where ID=500,即主鍵查詢方式,則只需要搜索 ID 這棵 B+ 樹
2、普通索引先搜索索引拿到主鍵值,再到主鍵索引樹搜索一次(回表)
如果語句是 select * from T where k=k=5,即普通索引查詢方式,則需要先搜索 k 索引樹,得到到 ID 的值為 500,再到 ID 索引樹搜索一次。這個過程為回表
也就是說,基於非主鍵索引的查詢需要多掃描一棵樹,因此,我們在應用中應該盡量使用主鍵查詢
三、索引維護
1、什么是自增主鍵
自增主鍵是指自增列上定義的主鍵,插入新記錄的時候可以不制定ID的值,系統會獲取當前ID最大值加1作為下一條記錄的ID值
也就是說,自增主鍵的插入數據模式,正符合我們前面提到的遞增插入的場景。每次插入一條新記錄,都是追加操作,都不涉及到挪動其他記錄,也不會觸發葉子節點的分裂

2、數據也滿了怎么辦?
一個數據頁滿了,按照B+Tree算法,新增加一個數據頁,叫做頁分裂,會導致性能下降。空間利用率降低大概50%。
當相鄰的兩個數據頁利用率很低的時候會做數據頁合並,合並的過程是分裂過程的逆過程。
分裂合並示意圖

3、主鍵長度越小,普通索引的葉子節點就越小,普通索引占用的空間也就越小
由於每個非主鍵索引的葉子節點上都有主鍵的值,
1、如果用身份證號做主鍵,那么每個二級索引的葉子節點占用的20個字節,
2、而如果用整型做主鍵,則只要4個字節,
3、如果是長整型則是8個字節
從性能和存儲空間方面考量,自增主鍵往往是更合理的選擇。
4、什么場景適合直接用業務字段直接做主鍵?
1、只有一個索引;
2、改索引必須是唯一索引。
你一定看出來了,這就是典型的KV場景
由於沒有其他索引,所以也就不用考慮其他索引的葉子節點大小的問題
這時候我們就要有限考慮上一段的“盡量使用主鍵查詢”原則,直接將這個索引設置為主鍵,可以避免每次查詢需要搜索兩棵樹
