Mysql索引 關於自增ID,你真的都瞭解透徹了嗎?

前言:以下所有所述均針對Mysql InnerDB引擎

一、建表採用自增ID

爲什麼建表的時候建議創建自增ID,直接用唯一業務的標識ID不香嗎?

是的,不香。

InnerDB使用的B+樹模型,B+樹的結構決定了 所有左節點< 節點< 右節點,這樣帶來的好處我就不詳細說了,壞處就是當新增主鍵破壞了現有樹形結構的時候,就需要將大於這個值得主鍵向後挪用。當需要挪動的數據頁已經處於存滿的狀態,就會更加的麻煩。但是當我們使用主鍵遞增ID的時候,所有新增的主鍵都爲當前主鍵的最大值,所以只需要在索引樹的最右邊加上一個記錄即可。這也就是爲什麼要採用自增ID的原因。舉一個的例子:

ID爲主鍵,下圖所示爲索引樹的示意圖

當你想加一條數據(ID=700)的時候,只需要在700節點的右邊新增一條新記錄即可。但是你新增的記錄爲(ID=400)的時候,你就需要把ID=500和ID=600的數據往後挪,然後把ID=400的記錄加進去。

二、什麼情況可以不使用自增ID

當然並不是所有的表都用自增ID好,例如這樣的情況:

1、只有一個索引

2、該索引必須是唯一索引

因爲業務的特性,我們一般並不會使用自增ID,可能主要還是會使用業務ID,那麼爲了高效的搜索,我們會給業務ID加上索引。

索引圖如下圖(ID爲主鍵,k上有索引):

不難發現,k索引樹上存的其實是主鍵ID的值,所以我們稱非主鍵索引爲二級索引。

在使用普通索引的時候,我們會先查詢出主鍵索引的值,然後再去主鍵索引樹上尋找具體的數據記錄,這個過程叫回表。

那麼回到剛開始的話題,如果滿足只有一個索引、並且該索引必須是唯一索引(Key-Value形式),那麼就能讓Key直接作爲主

鍵,從而杜絕了回表的行爲,達到提供性能的目的。

 

文章總結源於:Mysql實戰45講 基礎篇 04

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章