精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL 的自增主鍵一定是連續的嗎?

數據庫 MySQL
InnoDB 引擎的自增值,其實是保存在了內存里,并沒有持久化。第一次打開表的時候,都會去找自增值的最大值 max(id),然后將 max(id)+1 作為這個表當前的自增值。

眾所周知,自增主鍵可以讓聚集索引盡量地保持遞增順序插入,避免了隨機查詢,從而提高了查詢效率

但實際上,MySQL 的自增主鍵并不能保證一定是連續遞增的。

下面舉個例子來看下,如下所示創建一張表:

圖片

自增值保存在哪里?

使用 insert into test_pk values(null, 1, 1)? 插入一行數據,再執行 show create table 命令來看一下表的結構定義:

圖片

上述表的結構定義存放在后綴名為 .frm? 的本地文件中,在 MySQL 安裝目錄下的 data 文件夾下可以找到這個 .frm 文件:

圖片

從上述表結構可以看到,表定義里面出現了一個 AUTO_INCREMENT=2,表示下一次插入數據時,如果需要自動生成自增值,會生成 id = 2。

但需要注意的是,自增值并不會保存在這個表結構也就是 .frm 文件中,不同的引擎對于自增值的保存策略不同:

1)MyISAM 引擎的自增值保存在數據文件中

2)InnoDB 引擎的自增值,其實是保存在了內存里,并沒有持久化。第一次打開表的時候,都會去找自增值的最大值 max(id)?,然后將 max(id)+1 作為這個表當前的自增值。

舉個例子:我們現在表里當前數據行里最大的 id 是 1,AUTO_INCREMENT=2,對吧。這時候,我們刪除 id=1 的行,AUTO_INCREMENT 還是 2。

圖片

但如果馬上重啟 MySQL 實例,重啟后這個表的 AUTO_INCREMENT 就會變成 1。?也就是說,MySQL 重啟可能會修改一個表的 AUTO_INCREMENT 的值。

圖片

圖片

以上,是在我本地 MySQL 5.x 版本的實驗,實際上,到了 MySQL 8.0 版本后,自增值的變更記錄被放在了 redo log 中,提供了自增值持久化的能力,也就是實現了“如果發生重啟,表的自增值可以根據 redo  log 恢復為 MySQL 重啟前的值”

也就是說對于上面這個例子來說,重啟實例后這個表的 AUTO_INCREMENT 仍然是 2。

理解了 MySQL 自增值到底保存在哪里以后,我們再來看看自增值的修改機制,并以此引出第一種自增值不連續的場景。

自增值不連續場景 1

在 MySQL 里面,如果字段 id 被定義為 AUTO_INCREMENT,在插入一行數據的時候,自增值的行為如下:

  • 如果插入數據時 id 字段指定為 0、null 或未指定值,那么就把這個表當前的 AUTO_INCREMENT 值填到自增字段;
  • 如果插入數據時 id 字段指定了具體的值,就直接使用語句里指定的值。

根據要插入的值和當前自增值的大小關系,自增值的變更結果也會有所不同。假設某次要插入的值是 insert_num?,當前的自增值是 autoIncrement_num:

如果 insert_num < autoIncrement_num,那么這個表的自增值不變

如果 insert_num >= autoIncrement_num,就需要把當前自增值修改為新的自增值

也就是說,如果插入的 id 是 100,當前的自增值是 90,insert_num >= autoIncrement_num,那么自增值就會被修改為新的自增值即 101

一定是這樣嗎?

非也~

了解過分布式 id 的小伙伴一定知道,為了避免兩個庫生成的主鍵發生沖突,我們可以讓一個庫的自增 id 都是奇數,另一個庫的自增 id 都是偶數

這個奇數偶數其實是通過 auto_increment_offset? 和 auto_increment_increment 這兩個參數來決定的,這倆分別用來表示自增的初始值和步長,默認值都是 1。

所以,上面的例子中生成新的自增值的步驟實際是這樣的:從 auto_increment_offset? 開始,以 auto_increment_increment 為步長,持續疊加,直到找到第一個大于 100  的值,作為新的自增值。

所以,這種情況下,自增值可能會是 102,103 等等之類的,就會導致不連續的主鍵 id。

更遺憾的是,即使在自增初始值和步長這兩個參數都設置為 1 的時候,自增主鍵 id 也不一定能保證主鍵是連續的

自增值不連續場景 2

舉個例子,我們現在往表里插入一條 (null,1,1) 的記錄,生成的主鍵是 1,AUTO_INCREMENT= 2,對吧

圖片

這時我再執行一條插入 (null,1,1)? 的命令,很顯然會報錯 Duplicate entry?,因為我們設置了一個唯一索引字段 a:

圖片

但是,你會驚奇的發現,雖然插入失敗了,但自增值仍然從 2 增加到了 3!

這是為啥?

我們來分析下這個 insert 語句的執行流程:

  • 執行器調用 InnoDB 引擎接口準備插入一行記錄 (null,1,1);
  • InnoDB 發現用戶沒有指定自增 id 的值,則獲取表test_pk 當前的自增值 2;
  • 將傳入的記錄改成 (2,1,1);
  • 將表的自增值改成 3;
  • 繼續執行插入數據操作,由于已經存在 a=1 的記錄,所以報 Duplicate key error,語句返回

可以看到,自增值修改的這個操作,是在真正執行插入數據的操作之前。

這個語句真正執行的時候,因為碰到唯一鍵 a 沖突,所以 id = 2 這一行并沒有插入成功,但也沒有將自增值再改回去。所以,在這之后,再插入新的數據行時,拿到的自增 id 就是 3。也就是說,出現了自增主鍵不連續的情況。

至此,我們已經羅列了兩種自增主鍵不連續的情況:

  • 自增初始值和自增步長設置不為 1
  • 唯一鍵沖突

除此之外,事務回滾也會導致這種情況

自增值不連續場景 3

我們現在表里有一行 (1,1,1) 的記錄,AUTO_INCREMENT = 3:

圖片

我們先插入一行數據 (null, 2, 2),也就是 (3, 2, 2) 嘛,并且 AUTO_INCREMENT 變為 4:

圖片

再去執行這樣一段 SQL:

圖片

雖然我們插入了一條 (null, 3, 3) 記錄,但是使用 rollback 進行回滾了,所以數據庫中是沒有這條記錄的:

圖片

在這種事務回滾的情況下,自增值并沒有同樣發生回滾!如下圖所示,自增值仍然固執地從 4 增加到了 5:

圖片

所以這時候我們再去插入一條數據(null, 3, 3)的時候,主鍵 id 就會被自動賦為 5 了:

圖片

那么,為什么在出現唯一鍵沖突或者回滾的時候,MySQL 沒有把表的自增值改回去呢?回退回去的話不就不會發生自增 id 不連續了嗎?

事實上,這么做的主要原因是為了提高性能。

我們直接用反證法來驗證:假設 MySQL 在事務回滾的時候會把自增值改回去,會發生什么?

現在有兩個并行執行的事務 A 和 B,在申請自增值的時候,為了避免兩個事務申請到相同的自增 id,肯定要加鎖,然后順序申請,對吧。

  • 假設事務 A 申請到了 id = 1, 事務 B 申請到 id=2,那么這時候表 t 的自增值是3,之后繼續執行。
  • 事務 B 正確提交了,但事務 A 出現了唯一鍵沖突,也就是 id = 1 的那行記錄插入失敗了,那如果允許事務 A 把自增 id 回退,也就是把表的當前自增值改回 1,那么就會出現這樣的情況:表里面已經有 id = 2 的行,而當前的自增 id 值是 1。
  • 接下來,繼續執行的其他事務就會申請到 id=2。這時,就會出現插入語句報錯“主鍵沖突”。

圖片

而為了解決這個主鍵沖突,有兩種方法:

  • 每次申請 id 之前,先判斷表里面是否已經存在這個 id,如果存在,就跳過這個 id
  • 把自增 id 的鎖范圍擴大,必須等到一個事務執行完成并提交,下一個事務才能再申請自增 id

很顯然,上述兩個方法的成本都比較高,會導致性能問題。而究其原因呢,是我們假設的這個 “允許自增 id 回退”。

因此,InnoDB 放棄了這個設計,語句執行失敗也不回退自增 id。也正是因為這樣,所以才只保證了自增 id 是遞增的,但不保證是連續的。

綜上,已經分析了三種自增值不連續的場景,還有第四種場景:批量插入數據。

自增值不連續場景 4

對于批量插入數據的語句,MySQL 有一個批量申請自增 id 的策略:

  • 語句執行過程中,第一次申請自增 id,會分配 1 個;
  • 1 個用完以后,這個語句第二次申請自增 id,會分配 2 個;
  • 2 個用完以后,還是這個語句,第三次申請自增 id,會分配 4 個;
  • 依此類推,同一個語句去申請自增 id,每次申請到的自增 id 個數都是上一次的兩倍。

注意,這里說的批量插入數據,不是在普通的 insert 語句里面包含多個 value 值!!!,因為這類語句在申請自增 id 的時候,是可以精確計算出需要多少個 id 的,然后一次性申請,申請完成后鎖就可以釋放了。

而對于 insert … select、replace … select 和 load data 這種類型的語句來說,MySQL 并不知道到底需要申請多少 id,所以就采用了這種批量申請的策略,畢竟一個一個申請的話實在太慢了。

舉個例子,假設我們現在這個表有下面這些數據:

圖片

我們創建一個和當前表 test_pk? 有相同結構定義的表 test_pk2:

圖片

然后使用 insert...select? 往 teset_pk2 表中批量插入數據:

圖片

可以看到,成功導入了數據。

再來看下 test_pk2 的自增值是多少:

圖片

如上分析,是 8 而不是 6

具體來說,insert…select 實際上往表中插入了 5 行數據 (1 1)(2 2)(3 3)(4 4)(5 5)。但是,這五行數據是分三次申請的自增 id,結合批量申請策略,每次申請到的自增 id 個數都是上一次的兩倍,所以:

  • 第一次申請到了一個 id:id=1
  • 第二次被分配了兩個 id:id=2 和 id=3
  • 第三次被分配到了 4 個 id:id=4、id = 5、id = 6、id=7

由于這條語句實際只用上了 5 個 id,所以 id=6 和 id=7 就被浪費掉了。之后,再執行 insert into test_pk2 values(null,6,6),實際上插入的數據就是(8,6,6):

圖片

小結

總結下自增值不連續的四個場景:

  • 自增初始值和自增步長設置不為 1
  • 唯一鍵沖突
  • 事務回滾
  • 批量插入(如insert...select 語句)
責任編輯:武曉燕 來源: 飛天小牛肉
相關推薦

2023-12-26 01:09:28

MySQL存儲釋放鎖

2021-09-28 17:48:20

MySQL主鍵索引

2022-06-14 08:01:43

數據庫MySQL

2020-04-21 15:59:50

MySQL自增主鍵數據庫

2023-10-24 15:27:33

Mysql自增主鍵

2009-09-24 13:49:31

Hibernate自增

2020-05-06 15:02:58

MySQL數據庫技術

2010-06-04 11:15:23

MySQL自增主鍵

2015-11-12 09:58:45

多租戶SaaS軟件架構設計

2023-10-08 10:14:12

2025-07-03 02:15:00

MySQLID+UUIDB+樹

2024-06-07 10:14:23

2021-06-15 23:04:17

Localhost域名網絡

2010-08-31 08:38:55

SQL Server

2023-10-17 09:41:04

自增主鍵MySQL

2020-08-24 07:19:13

主鍵自增數據庫

2010-10-08 15:42:39

MySQL設置自增字段

2024-10-24 09:22:30

2020-05-11 10:48:01

技術資訊

2010-11-12 10:38:24

SQL Server自
點贊
收藏

51CTO技術棧公眾號

xxxxx91麻豆| 91成人国产精品| 97超碰人人模人人爽人人看| 免费在线一区二区三区| 人妖一区二区三区| 欧美无砖专区一中文字| 成年丰满熟妇午夜免费视频| 青青九九免费视频在线| 久久国产生活片100| 九九综合九九综合| 国产高清一区二区三区四区| 精品国产不卡一区二区| 欧美日韩免费在线观看| 在线播放豆国产99亚洲| 神马久久久久久久久久| 美女看a上一区| 欧美性做爰毛片| 亚洲二区在线播放| 久久91麻豆精品一区| 日韩欧美国产一区在线观看| 日av中文字幕| 17videosex性欧美| 国产精品国产三级国产有无不卡| 精品欧美一区二区三区久久久| 中文字幕永久在线视频| 国产日韩1区| 欧美日本中文字幕| 国产在线观看免费视频软件| 日韩美女精品| 精品精品国产高清一毛片一天堂| 久热精品在线播放| 免费成人美女女| 懂色av中文一区二区三区天美| 日本a级片在线观看| 91看片在线观看| 久久久久久久久蜜桃| 国产伦理一区二区三区| 国产极品久久久| 极品少妇xxxx精品少妇| 国产精品久久久久国产a级| av大片免费观看| 99精品国产福利在线观看免费 | 你懂的视频在线播放| 国产99精品视频| 92看片淫黄大片欧美看国产片| 综合久久中文字幕| 日韩黄色一级片| 日本一区二区在线免费播放| 日韩毛片一区二区三区| 午夜亚洲激情| 国产99久久精品一区二区| 99精品在线播放| 亚洲在线视频| 国产成人精品日本亚洲| 夜夜爽妓女8888视频免费观看| 午夜亚洲伦理| 日韩美女在线观看| 波多野结衣一本一道| 人妖欧美一区二区| 国产精品天天狠天天看| 中文字幕乱码在线观看| 久久成人免费电影| 亚洲自拍偷拍第一页| 成人1区2区3区| 成人av网站免费| 久久艳妇乳肉豪妇荡乳av| 天堂av网在线| 国产亚洲欧美激情| 一区视频二区视频| 性网站在线观看| 亚洲一区二区在线观看视频| 日韩视频在线视频| 性感女国产在线| 在线视频一区二区三| 欧美日韩中文不卡| 日本99精品| 日韩电影在线观看中文字幕| 一色道久久88加勒比一| 99热在线成人| 久久免费视频网| 天天爽夜夜爽人人爽| 久久国产日韩欧美精品| 国产九色91| 国产三级视频在线| 亚洲精品乱码久久久久久日本蜜臀| 亚洲精品蜜桃久久久久久| 成人香蕉视频| 欧美一级欧美三级在线观看| 亚洲国产精品自拍视频| 成人一二三区| 久久深夜福利免费观看| 亚洲男人的天堂在线视频| 日本欧美一区二区三区乱码| 亚洲中国色老太| 欧洲亚洲精品视频| 亚洲免费观看高清完整 | 青草av.久久免费一区| 亚洲aa中文字幕| 免费国产在线观看| 洋洋av久久久久久久一区| 日本999视频| 91亚洲无吗| 综合激情国产一区| 91久久国产视频| 久久99国内精品| 欧美理论一区二区| 牛牛电影国产一区二区| 欧美日本在线视频| 性高潮久久久久久久| 韩日成人在线| 91九色国产在线| 高清av在线| 五月婷婷综合网| 伦伦影院午夜理论片| 精品久久久久久久久久久下田| 久久99久久99精品中文字幕 | 日韩av中文字幕一区二区| 国产精品大全| 菠萝菠萝蜜在线观看| 欧美性色黄大片| 精品人妻一区二区三区视频| 国内精品久久久久久久影视蜜臀| 国产精品中文字幕在线观看| 视频国产在线观看| 亚洲国产欧美在线| 永久免费黄色片| 欧美r级电影| 国产精品国产三级国产专播精品人| 六月丁香综合网| 亚洲精品ww久久久久久p站| 成人免费在线观看视频网站| 国产成人影院| 琪琪亚洲精品午夜在线| 天天干天天舔天天射| 亚洲一区二区影院| 337p日本欧洲亚洲大胆张筱雨| 欧美国产一区二区三区激情无套| 欧美在线观看网站| 偷拍精品一区二区三区| 亚洲一二三四区| 95视频在线观看| 黄色在线成人| 国产精品自拍首页| 丁香高清在线观看完整电影视频| 日韩免费高清视频| 欧美成人三级视频| 国产成人av网站| 精品国偷自产一区二区三区| 中文字幕一区二区三区四区久久 | 韩国午夜理伦三级不卡影院| 伊人情人网综合| 国产一区 二区| 欧美另类在线观看| 成人小说亚洲一区二区三区 | 波多野结衣视频网址| 国产亚洲欧洲997久久综合| 一本色道无码道dvd在线观看| 国产成人ay| 国产免费一区二区三区香蕉精| 97最新国自产拍视频在线完整在线看| 在线精品视频免费播放| av在线免费播放网址| 国产一区二区视频在线播放| 特级西西444| 国产 日韩 欧美 综合 一区| 性色av一区二区三区在线观看 | 天堂av一区| 午夜精品蜜臀一区二区三区免费 | 中文字幕不卡的av| 亚洲激情在线看| 欧美色图麻豆| 蜜桃精品久久久久久久免费影院| 国产精品久久亚洲不卡| 久久久精品日本| 俄罗斯嫩小性bbwbbw| 色综合天天性综合| 少妇高潮惨叫久久久久| 成人做爰69片免费看网站| 日韩欧美亚洲天堂| 不卡的免费av| 欧洲乱码伦视频免费| 国产精品视频yy9099| 国产理论在线观看| 亚洲精品aⅴ中文字幕乱码 | 精品视频在线免费观看| 男女性高潮免费网站| fc2成人免费人成在线观看播放| 日本中文字幕片| 亚洲国产精品成人| 久久艳妇乳肉豪妇荡乳av| 亚洲一区二区av| 性欧美xxxx| 97视频精彩视频在线观看| 精品人在线二区三区| 国产美女www| 亚洲永久免费av| 中文字幕有码在线播放| 国产成人精品1024| 在线免费视频a| 亚洲一本视频| 伊人久久大香线蕉午夜av| 欧美深夜视频| 成人在线中文字幕| 日本成人精品视频| 欧洲精品99毛片免费高清观看| 午夜免费日韩视频| 国产盗摄在线观看| 亚洲免费影视第一页| 亚洲av无码片一区二区三区| 在线欧美小视频| 日本少妇做爰全过程毛片| 国产精品九色蝌蚪自拍| 亚洲午夜久久久久久久久红桃| 国产精品99久| 亚洲狼人综合干| 伊人影院久久| 国产美女视频免费| 精品国产美女| 久久日韩精品| 丁香综合av| 91传媒在线免费观看| 91成人在线| 国产成人精品久久二区二区91| 波多野结衣在线高清| 久久视频在线直播| 五月婷婷在线视频| 中文精品99久久国产香蕉| 日本在线一二三| 亚洲国产成人精品一区二区 | 在线日本欧美| 奇门遁甲1982国语版免费观看高清 | av在线国产精品| 国产精品免费久久久| 日韩影院在线| 18久久久久久| 亚洲欧洲自拍| 日本一欧美一欧美一亚洲视频| 国产白浆在线免费观看| 午夜精品久久久久久久久久久久久| 国产不卡在线| 欧美猛交免费看| 制服丝袜在线播放| 欧美成人免费小视频| 91极品在线| 欧美日韩高清在线观看| 色女人在线视频| 欧美极品xxxx| 国产在线美女| 国产91|九色| 依依综合在线| 国产精品国产亚洲伊人久久 | 欧美三级电影一区| 中文字幕制服诱惑| 69av一区二区三区| 精品人妻一区二区三区浪潮在线| 在线91免费看| 精品久久人妻av中文字幕| 日韩女优电影在线观看| 亚洲精品一区二区三区蜜桃| 欧美精品一区视频| 日av在线播放| 中文字幕一区日韩电影| 国产cdts系列另类在线观看| 欧美激情喷水视频| 樱花草涩涩www在线播放| 国产成人综合一区二区三区| 国产亚洲精彩久久| 亚洲在线免费看| 久久综合另类图片小说| 日韩精品不卡| 国产精品久久久久久久免费观看| 日韩成人午夜影院| 国产日韩欧美一区在线| 国产wwwxx| 国产成人啪午夜精品网站男同| 毛茸茸free性熟hd| 国产欧美日韩精品在线| 四虎永久免费在线| 懂色av影视一区二区三区| 在线观看亚洲一区二区| 日韩免费视频一区| 黄色电影免费在线看| 久久精品视频免费播放| 97蜜桃久久| 国产日韩欧美日韩| 免费福利视频一区| 亚洲一区二区三区精品视频| 国产精品久久| 久久午夜夜伦鲁鲁一区二区| 成人综合在线网站| 波多野结衣家庭教师在线观看 | 欧美黄色一级| 久久国产精品久久精品国产| 欧美激情黄色片| 日本福利视频在线| 国产综合色在线| 国产精品无码久久久久久| 亚洲人成网站精品片在线观看 | 免费不卡av| 国产精品免费久久久久久| 一区二区日韩| 正在播放一区| 美女诱惑一区| 丰满岳乱妇一区二区| 中文字幕亚洲一区二区av在线| 日本网站在线播放| 91精品国产免费| 国产精品免费播放| 97精品国产97久久久久久| 韩国一区二区三区视频| 日产精品高清视频免费| 亚洲激情成人| 日批视频在线看| 中文字幕在线观看不卡视频| 国产午夜麻豆影院在线观看| 精品国产一区二区国模嫣然| 国产在线一区二区视频| 国产成人精品午夜| 欧美挤奶吃奶水xxxxx| 欧美大黑帍在线播放| 久久精品国产77777蜜臀| 九色porny自拍视频| 黄色成人av在线| 丰满人妻熟女aⅴ一区| 久久这里只有精品视频首页| 成人午夜亚洲| 神马影院我不卡午夜| 香蕉精品999视频一区二区| 97中文字幕在线观看| 亚洲你懂的在线视频| 亚洲在线免费观看视频| 一区二区三区黄色| 欧美极品免费| 色999五月色| 日韩精品三区四区| 国产精品高清无码在线观看| 精品久久久久久久久久久久| 狠狠躁日日躁夜夜躁av| 久久久久成人网| 综合欧美亚洲| 东北少妇不带套对白| 成人avav在线| 天堂中文字幕在线观看| 日韩精品久久久久久福利| 激情黄产视频在线免费观看| 国产一区二区三区黄| 亚洲第一伊人| www.自拍偷拍| 在线观看亚洲成人| 爱久久·www| 川上优av一区二区线观看| 欧美a级在线| 无码人妻丰满熟妇啪啪网站| 亚洲一二三四在线| 亚洲日本在线播放| 茄子视频成人在线| 清纯唯美亚洲综合一区| 天天操天天干天天做| 亚洲美女在线一区| 欧美熟妇交换久久久久久分类| 97视频在线看| 国产亚洲一区二区三区啪| 向日葵污视频在线观看| 亚洲日本电影在线| 人妻中文字幕一区| 欧美与欧洲交xxxx免费观看| 日韩成人a**站| 伊人精品视频在线观看| 亚洲成人精品一区| 日本黄在线观看| 国产精品视频yy9099| 欧美色综合网| 在线小视频你懂的| 在线播放/欧美激情| 成年人在线网站| 日韩欧美亚洲精品| 国内精品在线播放| 五月天婷婷网站| 国产亚洲一级高清| 久久三级中文| 情侣黄网站免费看| 亚洲天堂福利av| 神马电影在线观看| 国产欧美一区二区白浆黑人| 尤物网精品视频| 亚洲一级片在线播放| 精品精品国产高清a毛片牛牛| 丝袜美腿诱惑一区二区三区| 国产四区在线观看| 26uuu亚洲综合色欧美| 国产又粗又猛视频| 91精品国产成人www| 午夜影院欧美| 国产美女免费网站| 精品三级在线观看| 国产欧美自拍| 18禁免费无码无遮挡不卡网站 | 亚洲另类在线观看| 久久91亚洲人成电影网站| 精品久久不卡|