MySQL實戰45講學習筆記:第四講


一、索引模型

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場景

由於沒有其他索引,所以也就不用考慮其他索引的葉子節點大小的問題

這時候我們就要有限考慮上一段的“盡量使用主鍵查詢”原則,直接將這個索引設置為主鍵,可以避免每次查詢需要搜索兩棵樹

 


免責聲明!

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



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