亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > MySQL自增ID耗盡實例講解

MySQL自增ID耗盡實例講解

熱門標簽:電話機器人市場趨勢 百度地圖標注后不顯示 電銷機器人 行業 南昌高頻外呼系統哪家公司做的好 電銷機器人各個細節介紹 溫州瑞安400電話怎么申請 昆明電信400電話辦理 淄博400電話申請 俄國地圖標注app

顯示定義ID

表定義的自增值ID達到上限后,在申請下一個ID時,得到的值保持不變

-- (2^32-1) = 4,294,967,295
-- 建議使用 BIGINT UNSIGNED
CREATE TABLE t (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT=4294967295;
INSERT INTO t VALUES (null);

-- AUTO_INCREMENT沒有改變
mysql> SHOW CREATE TABLE t;
+-------+------------------------------------------------------+
| Table | Create Table           |
+-------+------------------------------------------------------+
| t  | CREATE TABLE `t` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------+

mysql> INSERT INTO t VALUES (null);
ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY'

InnoDB row_id

1、如果創建的InnoDB表沒有指定主鍵,那么InnoDB會創建一個不可見的,長度為6 Bytes的row_id

2、InnoDB維護一個全局的dict_sys.row_id值,所有無主鍵的InnoDB表,每插入一行數據

  • 都將當前的dict_sys.row_id值作為要插入數據的row_id,然后把dict_sys.row_id的值+1

3、代碼實現上,row_id是一個8 Bytes的BIGINT UNSIGNED

  • 但InnoDB設計時,給row_id只保留了6 Bytes的空間,寫到數據表時只會存放最后的6 Bytes
  • row_id的取值范圍:0 ~ 2^48-1
  • 達到上限后,下一個值就是0

4、在InnoDB里面,申請到row_id=N后,就將這行數據寫入表中

  • 如果表中已經有row_id=N的行,新寫入的行就會覆蓋原有的行

5、推薦顯示創建自增主鍵

  • 表自增ID達到上限后,再插入數據時會報主鍵沖突的錯誤,影響的是可用性
  • 而覆蓋數據,意味著數據丟失,影響的是可靠性
  • 一般來說,可靠性優于可用性

XID

1、redolog和binlog相配合的時候,有一個共同的字段XID,對應一個事務

2、生成邏輯

  • MySQL內部維護一個全局變量global_query_id
  • 每次執行語句的時候將global_query_id賦值給Query_id,然后global_query_id+1
  • 如果當前語句是這個事務執行的第一條語句,把Query_id賦值給這個事務的XID

3、global_query_id是一個純內存變量,重啟之后清零

  • 因此,在同一個數據庫實例中,不同事務的XID也有可能是相同的
  • MySQL重啟之后,會重新生成新的binlog
    • 保證:同一個binlog文件里,XID是唯一的
  • global_query_id達到上限后,就會繼續從0開始計數
    • 因此理論上,同一個binlog還是會出現相同的XID,只是概率極低

4、global_query_id是8 Bytes,上限為2^64-1

  • 執行一個事務,假設XID是A
  • 接下來執行2^64次查詢語句,讓global_query_id回到A
  • 再啟動一個事務,這個事務的XID也是A

InnoDB trx_id

1、XID是由Server層維護的

2、InnoDB內部使用的是trx_id,為的是能夠在InnoDB事務和Server層之間做關聯

3、InnoDB內部維護一個max_trx_id的全局變量

  • 每次需要申請一個新的trx_id,就獲得max_trx_id的當前值,然后max_trx_id+1

4、InnoDB數據可見性的核心思想

  • 每一行數據都記錄了更新它的trx_id
  • 當一個事務讀到一行數據的時候,判斷數據可見性的方法
    • 事務的一致性視圖和這行數據的trx_id做對比

5、對于正在執行的事務,可以通過information_schema.innodb_trx看到事務的trx_id

操作序列

時刻 session A session B
T1 BEGIN;
SELECT * FROM t LIMIT 1;
T2 USE information_schema;
SELECT trx_id,trx_mysql_thread_id FROM innodb_trx;
T3 INSERT INTO t VALUES (null);
T4 SELECT trx_id,trx_mysql_thread_id FROM innodb_trx;

-- T2時刻
mysql> SELECT trx_id,trx_mysql_thread_id FROM innodb_trx;
+-----------------+---------------------+
| trx_id   | trx_mysql_thread_id |
+-----------------+---------------------+
| 281479812572992 |     30 |
+-----------------+---------------------+

-- T4時刻
mysql> SELECT trx_id,trx_mysql_thread_id FROM innodb_trx;
+-----------------+---------------------+
| trx_id   | trx_mysql_thread_id |
+-----------------+---------------------+
| 7417540   |     30 |
+-----------------+---------------------+

mysql> SHOW PROCESSLIST;
+----+-----------------+-----------+--------------------+---------+--------+------------------------+------------------+
| Id | User   | Host  | db     | Command | Time | State     | Info    |
+----+-----------------+-----------+--------------------+---------+--------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL    | Daemon | 344051 | Waiting on empty queue | NULL    |
| 30 | root   | localhost | test    | Sleep | 274 |      | NULL    |
| 31 | root   | localhost | information_schema | Query |  0 | starting    | SHOW PROCESSLIST |
+----+-----------------+-----------+--------------------+---------+--------+------------------------+------------------+

1、trx_mysql_thread_id=30就是線程ID,即session A所在的線程

2、T1時刻,trx_id的值其實為0,而很大的值只是為了顯示用的(區別于普通的讀寫事務)

3、T2時刻,trx_id是一個很大的數字,因為在T1時刻,session A并未涉及更新操作,是一個只讀事務

  • 對于只讀事務,InnoDB不會分配trx_id

4、session A在T3時刻執行INSERT語句時,InnoDB才真正分配trx_id

只讀事務

1、在上面的T2時刻,很大的trx_id是由系統臨時計算出來的

  • 把當前事務的trx變量的指針地址轉成整數,再加上2^48

2、同一個只讀事務在執行期間,它的指針地址是不會變的

  • 不論是在innodb_trx還是innodb_locks表里,同一個只讀事務查出來的trx_id都是一樣的

3、如果有多個并行的只讀事務,每個事務的trx變量的指針地址肯定是不同的

  • 不同的并發只讀事務,查出來的trx_id是不同的

4、加上2^48的目的:保證只讀事務顯示的trx_id值比較大,用于區別普通的讀寫事務

5、trx_id與row_id的邏輯類似,定義長度為8 Bytes

  • 在理論上,可能會出現一個讀寫事務與一個只讀事務顯示的trx_id相同的情況
  • 但概率極低,并且沒有什么實質危害

6、只讀事務不分配trx_id的好處

  • 可以減少事務視圖里面活躍數組的大小
    • 當前正在運行的只讀事務,是不影響數據的可見性判斷
    • 因此,在創建事務的一致性視圖時,只需要拷貝讀寫事務的trx_id
  • 可以減少trx_id的申請次數
    • 在InnoDB里,即使只執行一條普通的SELECT語句,在執行過程中,也要對應一個只讀事務
    • 如果普通查詢語句不申請trx_id,就可以大大減少并發事務申請trx_id的鎖沖突
    • 由于只讀事務不分配trx_id,trx_id的增加速度會變慢

7、max_trx_id會持久化存儲,重啟不會重置為0,只有到達2^48-1的上限后,才會重置為0

thread_id

1、SHOW PROCESSLIST的第一列就是thread_id

2、系統保存了一個環境變量thread_id_counter

  • 每新建一個連接,就將thread_id_counter賦值給這個新連接的線程變量

3、thread_id_counter定義為4 Bytes,因此達到2^32-1后就會重置為0

  • 但不會在SHOW PROCESSLIST里面看到兩個相同的thread_id
  • 因為MySQL設計了一個唯一數組的邏輯,給新線程分配thread_id,邏輯代碼如下
do {
  new_id= thread_id_counter++;
} while (!thread_ids.insert_unique(new_id).second);

參考資料

《MySQL實戰45講》

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 關于mysql自增id,你需要知道的
  • MySQL表自增id溢出的故障復盤解決
  • 關于MySQL自增ID的一些小問題總結
  • 關于Mysql自增id的這些你可能還不知道
  • mysql自增id超大問題的排查與解決
  • MySQL分表自增ID問題的解決方法
  • 兩種mysql對自增id重新從1排序的方法
  • 利用mysql事務特性實現并發安全的自增ID示例
  • mysql自增ID起始值修改方法
  • MySQL的自增ID(主鍵) 用完了的解決方法

標簽:吐魯番 洛陽 葫蘆島 安徽 海口 甘南 嘉峪關 拉薩

巨人網絡通訊聲明:本文標題《MySQL自增ID耗盡實例講解》,本文關鍵詞  MySQL,自增,耗盡,實例,講解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL自增ID耗盡實例講解》相關的同類信息!
  • 本頁收集關于MySQL自增ID耗盡實例講解的相關信息資訊供網民參考!
  • 推薦文章
    国产伦久视频免费观看 视频| 亚洲精品中文一区不卡| 精品国产一级毛片| a级精品九九九大片免费看| 国产成a人片在线观看视频| 亚洲第一色在线| 午夜激情视频在线播放| 你懂的国产精品| 亚欧乱色一区二区三区| 97视频免费在线观看| 亚洲精品中文一区不卡| 国产一级强片在线观看| 色综合久久天天综合观看| 欧美a级大片| 午夜在线观看视频免费 成人| 国产原创视频在线| 欧美激情在线精品video| 国产麻豆精品视频| 免费毛片播放| 成人免费观看网欧美片| 国产a一级| 国产一区精品| 日韩免费片| 精品久久久久久中文字幕2017| 黄色免费三级| 久久国产精品只做精品| 欧美一级视频免费观看| 99色视频在线| 国产视频一区二区三区四区| 日韩免费在线视频| 麻豆系列 在线视频| 精品国产一区二区三区久久久狼| 日日日夜夜操| 亚洲精品中文一区不卡| 91麻豆精品国产自产在线| 成人免费观看网欧美片| 一级女人毛片人一女人| 国产不卡在线观看视频| 精品毛片视频| 国产一区二区精品久久91| 欧美另类videosbestsex高清| 日本伦理片网站| 久久成人综合网| 国产欧美精品午夜在线播放| 成人影院一区二区三区| 国产极品白嫩美女在线观看看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产成人女人在线视频观看| 国产不卡在线观看视频| 久久精品道一区二区三区| 日韩在线观看视频黄| 国产a视频精品免费观看| 国产网站免费视频| 韩国毛片| 高清一级片| 日本免费看视频| 精品国产一级毛片| 国产成人精品综合久久久| 黄色免费三级| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品视频在线观看一区二区| 999久久66久6只有精品| 国产一区免费观看| 你懂的国产精品| 国产亚洲免费观看| 成人在免费观看视频国产| 国产一级强片在线观看| 欧美激情一区二区三区视频| 国产国语对白一级毛片| 日本伦理黄色大片在线观看网站| 国产成人精品影视| 久久国产精品自线拍免费| 欧美激情在线精品video| 国产网站免费观看| 日本在线播放一区| 一级片免费在线观看视频| 欧美一级视| 日韩中文字幕在线亚洲一区| 美女免费精品视频在线观看| 国产网站免费视频| 一级毛片视频免费| 国产伦精品一区二区三区无广告 | 九九九网站| 国产一区二区精品久久91| 欧美爱色| 久久精品人人做人人爽97| 国产视频一区二区在线观看| 天天色色网| 国产精品免费精品自在线观看| 九九九网站| 国产a一级| 台湾毛片| 国产一区免费观看| 亚洲精品久久玖玖玖玖| 成人高清免费| 91麻豆精品国产片在线观看| 国产一区二区精品在线观看| 天天做人人爱夜夜爽2020毛片| 九九九国产| 精品在线免费播放| 日本在线播放一区| 青青青草影院| 国产91丝袜高跟系列| 亚欧乱色一区二区三区| 国产国产人免费视频成69堂| 午夜精品国产自在现线拍| 欧美国产日韩一区二区三区| 高清一级片| 黄视频网站在线免费观看| 日本特黄特黄aaaaa大片 | 亚州视频一区二区| 一 级 黄 中国色 片| 久久国产一久久高清| 999精品影视在线观看| 久久国产精品自由自在| 一级片片| 高清一级淫片a级中文字幕| 欧美国产日韩一区二区三区| 精品视频在线观看一区二区三区| 久久国产精品只做精品| 美女免费毛片| 国产麻豆精品免费视频| 国产原创视频在线| 欧美激情一区二区三区视频高清 | 精品国产一区二区三区免费 | 你懂的日韩| 久久精品店| 欧美激情一区二区三区在线播放| 九九久久国产精品大片| 国产91丝袜高跟系列| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产伦精品一区三区视频| 午夜家庭影院| 国产不卡在线观看视频| 韩国三级香港三级日本三级la | 国产精品12| 天天做人人爱夜夜爽2020毛片| 亚洲第一色在线| 久久久久久久免费视频| 青青久久国产成人免费网站| 成人高清免费| 成人av在线播放| 黄色福利片| 国产激情一区二区三区| 欧美激情影院| 九九久久国产精品| 欧美大片一区| 日本特黄特黄aaaaa大片 | 青青青草视频在线观看| 日韩在线观看视频黄| 青青青草影院| 成人高清视频在线观看| 国产伦精品一区二区三区在线观看 | 精品国产一区二区三区国产馆| 国产网站免费观看| 91麻豆爱豆果冻天美星空| 国产不卡精品一区二区三区| 久久99青青久久99久久| 欧美激情一区二区三区视频高清| 国产综合成人观看在线| 99久久精品国产国产毛片| 国产精品1024永久免费视频| 美国一区二区三区| 日韩在线观看视频黄| 黄色短视屏| 成人影视在线观看| 黄色福利片| 人人干人人插| 欧美一级视频高清片| 欧美电影免费| 国产伦精品一区二区三区在线观看 | 欧美国产日韩精品| 人人干人人插| 国产国产人免费视频成69堂| 韩国毛片| 午夜欧美成人久久久久久| 91麻豆国产福利精品| 久久久久久久久综合影视网| 欧美18性精品| 久久99青青久久99久久| 精品国产一级毛片| 999久久66久6只有精品| 久久99这里只有精品国产| 久久99中文字幕| 国产伦久视频免费观看 视频| 欧美大片a一级毛片视频| 亚洲 欧美 成人日韩| 亚欧乱色一区二区三区| 午夜激情视频在线播放| 日韩一级黄色大片| 精品国产一区二区三区免费 | 免费一级片网站| 午夜欧美成人久久久久久| 久久精品免视看国产成人2021| 久久久成人网| 成人高清视频在线观看| 精品国产三级a∨在线观看| 免费的黄视频| 国产不卡在线观看视频| 亚洲第一页色|