前言:以下所有所述均針對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