mysql爲什麼建議使用自增主鍵

 

前面我寫了幾篇關於 mysql 索引的文章,索引是 mysql 非常重要的一部分。你也可能經常會看到一些關於 mysql 軍規、mysql 查詢優化的文章,其實這些操作的背後都是基於一定的原理的,你要想明白這些原理,首先就得知道 mysql 底層的一些東西。

 

我在這裏舉幾個例子吧。

 

我們都知道表的主鍵一般都要使用自增 id,不建議使用業務 id ,是因爲使用自增 id 可以避免頁分裂。這個其實可以相當於一個結論,你都可以直接記住這個結論就可以了。

 

 

但是如果你要弄明白什麼是頁分裂,或者什麼情況下會頁分裂,這個時候你就需要對 mysql 的底層數據結構要有一定的理解了。

 

我這裏也稍微解釋一下頁分裂,mysql (注意本文講的 mysql 默認爲InnoDB 引擎)底層數據結構是 B+ 樹,所謂的索引其實就是一顆 B+ 樹,一個表有多少個索引就會有多少顆 B+ 樹,mysql 中的數據都是按順序保存在 B+ 樹上的(所以說索引本身是有序的)。

 

然後 mysql 在底層又是以數據頁爲單位來存儲數據的,一個數據頁大小默認爲 16k,當然你也可以自定義大小,也就是說如果一個數據頁存滿了,mysql 就會去申請一個新的數據頁來存儲數據。

 

如果主鍵爲自增 id 的話,mysql 在寫滿一個數據頁的時候,直接申請另一個新數據頁接着寫就可以了。

 

如果主鍵是非自增 id,爲了確保索引有序,mysql 就需要將每次插入的數據都放到合適的位置上。

 

當往一個快滿或已滿的數據頁中插入數據時,新插入的數據會將數據頁寫滿,mysql 就需要申請新的數據頁,並且把上個數據頁中的部分數據挪到新的數據頁上。

 

這就造成了頁分裂,這個大量移動數據的過程是會嚴重影響插入效率的。

 

其實對主鍵 id 還有一個小小的要求,在滿足業務需求的情況下,儘量使用佔空間更小的主鍵 id,因爲普通索引的葉子節點上保存的是主鍵 id 的值,如果主鍵 id 佔空間較大的話,那將會成倍增加 mysql 空間佔用大小。

 

本來這篇文章是打算總結一下前面寫的幾篇關於 mysql 索引的文章的,也是打算多舉幾個例子的,結果發現光寫了一個自增主鍵就寫了一大堆了,然後時間也比較晚了,乾脆就寫到這吧,原本計劃的幾個其他例子後面再單獨寫吧。

 

如果你對 B+ 樹不是很清楚的話,建議你去看下我下面這幾篇推薦文章。

 

推薦文章:

mysql索引爲啥要選擇B+樹 (上)

mysql索引爲啥要選擇B+樹 (下)

 mysql爲什麼加索引就能快

 

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