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

2021-09-24 19:05:40 字數 1193 閱讀 5533

前面我寫了幾篇關於 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為什麼加索引就能快

為什麼mysql自增主鍵不是連續的

目錄 提出這個問題,是因為在工作中發現 mysql 中的 user 表的 id 預設是自程式設計客棧增的,但是資料庫儲存的結果卻不是連續的。user 表結構 create table user id bigint 20 unsigned not null auto increment comment...

python 為什麼沒有自增自減符

b 5 a 5 id a 162334512 id b 162334512 a is b true 可以看出,python 中,變數是以內容為基準而不是像 c 中以變數名為基準,所以只要你的數字內容是5,不管你起什麼名字,這個變數的 id 是相同的,同時也就說明了 python 中乙個變數可以以多個...

為什麼mysql事務回滾後, 自增ID依然自增

事務回滾後,自增id仍然增加,回滾後,自增id仍然增加。比如當前id是7,插入一條資料後,又回滾了。然後你再插入一條資料,此時插入成功,這時候你的id不是8,而是9。因為雖然你之前插入回滾,但是id還是自增了。如果你認為自增id不應該被事務化,那麼其他事務不得不等待著,檢查自增id是被使用還是被回滾...