日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于自增id 你可能还不知道

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于自增id 你可能还不知道 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導讀:在使用MySQL建表時,我們通常會創建一個自增字段(AUTO_INCREMENT),并以此字段作為主鍵。本篇文章將以問答的形式講述關于自增id的一切。

注: 本文所講的都是基于Innodb存儲引擎。

1.MySQL為什么建議將自增列id設為主鍵?

  • 如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會選擇主鍵作為聚集索引、如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

  • 數據記錄本身被存于主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開辟一個新的頁(節點)

  • 如果表使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當前索引節點的后續位置,當一頁寫滿,就會自動開辟一個新的頁

  • 如果使用非自增主鍵(如果×××號或學號等),由于每次插入主鍵的值近似于隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,后續不得不通過OPTIMIZE TABLE來重建表并優化填充頁面。

綜上而言:當我們使用自增列作為主鍵時,存取效率是最高的。

2.自增列id一定是連續的嗎?

自增id是增長的 不一定連續。

我們先來看下MySQL 對自增值的保存策略:

InnoDB 引擎的自增值,其實是保存在了內存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才實現了“如果發生重啟,表的自增值可以恢復為 MySQL 重啟前的值”,具體情況是:

在 MySQL 5.7 及之前的版本,自增值保存在內存里,并沒有持久化。每次重啟后,第一次打開表的時候,都會去找自增值的最大值 max(id),然后將 max(id)+1 作為這個表當前的自增值。

舉例來說,如果一個表當前數據行里最大的 id 是 10,AUTO_INCREMENT=11。這時候,我們刪除 id=10 的行,AUTO_INCREMENT 還是 11。但如果馬上重啟實例,重啟后這個表的 AUTO_INCREMENT 就會變成 10。

也就是說,MySQL 重啟可能會修改一個表的 AUTO_INCREMENT 的值。

在 MySQL 8.0 版本,將自增值的變更記錄在了 redo log 中,重啟的時候依靠 redo log 恢復重啟之前的值。

造成自增id不連續的情況可能有:

  • 1.唯一鍵沖突
  • 2.事務回滾
  • 3.insert ... select語句批量申請自增id

3.自增id有上限嗎?

自增id是整型字段,我們常用int類型來定義增長id,而int類型有上限 即增長id也是有上限的。

下表列舉下 int 與 bigint 字段類型的范圍:

類型大小范圍(有符號)范圍(無符號)
int4字節(-2147483648,2147483647)(0,4294967295)
bigint8字節(-9223372036854775808,9223372036854775807)(0,18446744073709551615)

從上表可以看出:當自增字段使用int有符號類型時,最大可達2147483647即21億多;使用int無符號類型時,最大可達4294967295即42億多。當然bigint能表示的范圍更大。

下面我們測試下當自增id達到最大時再次插入數據會怎么樣:

create table t(id int unsigned auto_increment primary key) auto_increment=4294967295; insert into t values(null); // 成功插入一行 4294967295 show create table t; /* CREATE TABLE `t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295; */insert into t values(null); //Duplicate entry '4294967295' for key 'PRIMARY'

從實驗可以看出,當自增id達到最大時將無法擴展,第一個 insert 語句插入數據成功后,這個表的AUTO_INCREMENT 沒有改變(還是 4294967295),就導致了第二個 insert 語句又拿到相同的自增 id 值,再試圖執行插入語句,報主鍵沖突錯誤。

4.關于自增列 我們該怎么維護?

維護方面主要提供以下2點建議:

  • 1.字段類型選擇方面:推薦使用int無符號類型,若可預測該表數據量將非常大 可改用bigint無符號類型。
  • 2.多關注大表的自增值,防止發生主鍵溢出情況。

轉載于:https://blog.51cto.com/10814168/2374957

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的关于自增id 你可能还不知道的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产 欧美 日韩 一区 | 亚洲精品人妻无码 | 精品人妻一区二区三区久久夜夜嗨 | 69精品丰满人妻无码视频a片 | 欧美日韩一区二区视频观看 | 天堂av中文 | 免费成人在线播放 | 国产区福利 | 波多野结衣中文字幕在线 | 亚洲三区在线观看无套内射 | 特黄级| 精品美女久久久久 | 视频免费观看在线 | 国产小视频在线看 | 国产成人av一区二区三区在线观看 | 国产成人精品无码免费看81 | 四虎影像 | 欧美不卡在线 | 色爱av综合 | 亚洲高清视频网站 | 河北彩花av在线播放 | 夜夜爽天天干 | 偷拍亚洲精品 | 亚洲www在线观看 | 免费成人进口网站 | 人人射影院 | 亚洲av永久无码精品放毛片 | 一本免费视频 | 国内一区二区三区 | 成人欧美一区二区三区在线播放 | 色爽交| 日韩av黄色片 | 做爰无遮挡三级 | 精品国产乱子伦一区二区 | 久久黄色片视频 | 国产精品久久久av | 九九热视频这里只有精品 | 中文字幕一区二 | 无码成人一区二区 | 久久久一区二区 | 成人在线免费播放视频 | 欧美美女性高潮 | 国产一二三四在线 | 人人爽人人 | 欧美视频久久久 | 懂色av一区二区三区免费观看 | 国产免费91 | 中文字幕欧美另类精品亚洲 | 欧美成人a视频 | 清冷学长被爆c躁到高潮失禁 | 青春草在线视频观看 | www色婷婷| 911精品国产一区二区在线 | 国产综合社区 | 在线三区 | 在线观看亚洲一区 | 在线涩涩 | 欧美日韩性视频 | 手机在线免费观看av | 天天人人 | 18岁毛片 | 麻豆传媒在线 | 亚洲性色图 | 伊人网大 | 成人国产精品入口免费视频 | 色午夜| 黄色片网站免费在线观看 | 成人毛片100部免费看 | 成人免费网站www网站高清 | 欧美成人aaaa | 超碰人人99 | 人妻无码一区二区三区四区 | 欧美成人精品在线观看 | 日本福利视频导航 | 波多野结衣中文字幕一区二区 | 天天操狠狠操夜夜操 | 91娇羞白丝网站 | 99免费视频 | 久久偷看各类女兵18女厕嘘嘘 | 日本黄色一区二区三区 | 日韩在线视频第一页 | 免费高清视频一区二区三区 | 天堂久久久久久 | 色眯眯网 | 亚洲精品国产精品国自 | 迈开腿让我尝尝你的小草莓 | 黄色片99| 国产aⅴ精品一区二区三区久久 | 黑人精品一区二区三区 | 日批视频免费观看 | 亚洲av成人精品一区二区三区 | 色婷婷18| av免费观| 逼特逼视频在线观看 | 大尺度摸揉捏胸床戏视频 | 久久精品10 | 鲁一鲁在线 | 欧美国产二区 | 久久成人综合网 |