mysql自增主鍵怎麼用

2021-10-18 18:34:03 字數 1702 閱讀 3604

參考文章

通常,自增主鍵的設定如下:

`id`

intunsigned

notnull

auto_increment

,

如果設定成這樣,則id的取值範圍是[0, 2^32 -1],即[0,4294967295].若表的資料量龐大,自增主鍵超過4294967295時,會報主鍵衝突異常,導致資料無法插入。

解決辦法是,將int 改為bigint。

`id`

bigint

unsigned

notnull

auto_increment

,

由於bigint為8b,他的unsigned 表示範圍大大增加,為[0,2^64 -1],即[0,18446744073709551615] ,這下基本上就不用愁主鍵被用光了。

如果欄位id被定義為auto_increment,在插入一行資料的時候,自增值的行為如下:

1.如果插入資料時id欄位指定為0、null或未指定值,那麼就把這個表當前的auto_increment值填到自增欄位

2.如果插入資料時id欄位指定了具體的值,就直接使用語句裡指定的值

假設,某次要插入的值是x,當前的自增值是y

1.如果x=y,就需要把當前自增值修改為新的自增值
新的自增值生成演算法是:

從auto_increment_offset(初始值)開始,以auto_increment_increment(步長)為步長,持續疊加,直到找到第乙個大於x的值,作為新的自增值

發生事務回滾時。因為每次取自增值都會變化,事務回滾時並不會撤回已經被取走的自增值,因此當發生事務回滾時會發生自增列不連續的情況。

發生唯一鍵衝突時。發生唯一鍵衝突之前,首先會獲取當前自增值填入自增列,然後由於發生唯一鍵衝突,導致插入失敗,但此時自增值已經發生了變化,會導致不連續。

insert…select語句執行時。

insert…select語句執行時如果插入多行,會批量申請自增值,第一次申請1個,第二次申請2個,第三次申請4個,第n次申請2^(n-1)個。所以如果第n次申請了多個值,但是沒有用掉的話,也會造成自增列不連續。

mysql自增主鍵的設計可以讓主鍵索引盡量地保持遞增順序插入,避免了頁**,因此索引更緊湊。這樣在執行效率上會相對高於使用者自定義的主鍵。

①:由於自增主鍵的天然屬性,別人一旦爬取你的資料庫,就可以根據資料庫的自增id獲取到你的業務增長資訊,很容易估計你的經營情況

②:對於高併發的負載,innodb在按主鍵進行插入的時候會造成明顯的鎖爭用,主鍵的上界會成為爭搶的熱點,因為所有的插入都發生在這裡,併發插入會導致間隙鎖競爭

③:auto_increment鎖機制會造成自增鎖的搶奪,有一定的效能損失

auto_increment的鎖爭搶問題,如果要改善需要調優innodb_autoinc_lock_mode的配置

由於這兩者id的隨機性,導致mysql無法實現像自增主鍵那樣的索引定位及記憶體分配,因此在效能上及記憶體利用率上都要略遜一籌。從業務角度考慮,如果表的資料量不算大且對效能沒有太大的要求的情況下,選擇這兩者也是可以的。對比文章參考: 深入分析mysql為什麼不推薦使用uuid或者雪花id作為主鍵

mysql的自增id(主鍵) 用完了的解決方法

深入分析mysql為什麼不推薦使用uuid或者雪花id作為主鍵

mysql自增主鍵詳解

mysql 主鍵自增語句 MySQL 自增主鍵

以下僅考慮 innodb 儲存引擎。自增主鍵有兩個性質需要考慮 單調性每次插入一條資料,其 id 都是比上一條插入的資料的 id 大,就算上一條資料被刪除。連續性插入成功時,其資料的 id 和前一次插入成功時資料的 id 相鄰。自增主鍵的單調性 為何會有單調性的問題?這主要跟自增主鍵最大值的獲取方式...

MySQL設定主鍵自增和非主鍵自增

mysql 每張表只能有1個自動增長字段,這個自動增長字段即可作為主鍵,也可以用作非主鍵使用,但是請注意將自動增長字段當做非主鍵使用時必須必須為其新增唯一索引,否則系統將會報錯。例如 將自動增長字段設定為主鍵 create table t1 id int auto increment primary...

mysql的自增主鍵

autotest表是測試表 mysql版本為5.7 結構如下 1.insert into指定自增主鍵的值時,自增主鍵會變嗎?以下是表中資料的初始值 接著插入自增主鍵9 如果insert指定自增主鍵的值不會導致auto increment值的變化的話,那麼接著不指定自增主鍵的值執行insert語句時,...