顯示定義ID
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的團(tuán)風(fēng)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
表定義的自增值ID達(dá)到上限后,在申請(qǐng)下一個(gè)ID時(shí),得到的值保持不變
-- (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、如果創(chuàng)建的InnoDB表沒有指定主鍵,那么InnoDB會(huì)創(chuàng)建一個(gè)不可見的,長(zhǎng)度為6 Bytes的row_id
2、InnoDB維護(hù)一個(gè)全局的dict_sys.row_id值,所有無主鍵的InnoDB表,每插入一行數(shù)據(jù)
3、代碼實(shí)現(xiàn)上,row_id是一個(gè)8 Bytes的BIGINT UNSIGNED
4、在InnoDB里面,申請(qǐng)到row_id=N后,就將這行數(shù)據(jù)寫入表中
5、推薦顯示創(chuàng)建自增主鍵
XID
1、redolog和binlog相配合的時(shí)候,有一個(gè)共同的字段XID,對(duì)應(yīng)一個(gè)事務(wù)
2、生成邏輯
3、global_query_id是一個(gè)純內(nèi)存變量,重啟之后清零
4、global_query_id是8 Bytes,上限為2^64-1
InnoDB trx_id
1、XID是由Server層維護(hù)的
2、InnoDB內(nèi)部使用的是trx_id,為的是能夠在InnoDB事務(wù)和Server層之間做關(guān)聯(lián)
3、InnoDB內(nèi)部維護(hù)一個(gè)max_trx_id的全局變量
4、InnoDB數(shù)據(jù)可見性的核心思想
5、對(duì)于正在執(zhí)行的事務(wù),可以通過information_schema.innodb_trx看到事務(wù)的trx_id
操作序列
時(shí)刻 | 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時(shí)刻 mysql> SELECT trx_id,trx_mysql_thread_id FROM innodb_trx; +-----------------+---------------------+ | trx_id | trx_mysql_thread_id | +-----------------+---------------------+ | 281479812572992 | 30 | +-----------------+---------------------+ -- T4時(shí)刻 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時(shí)刻,trx_id的值其實(shí)為0,而很大的值只是為了顯示用的(區(qū)別于普通的讀寫事務(wù))
3、T2時(shí)刻,trx_id是一個(gè)很大的數(shù)字,因?yàn)樵赥1時(shí)刻,session A并未涉及更新操作,是一個(gè)只讀事務(wù)
4、session A在T3時(shí)刻執(zhí)行INSERT語句時(shí),InnoDB才真正分配trx_id
只讀事務(wù)
1、在上面的T2時(shí)刻,很大的trx_id是由系統(tǒng)臨時(shí)計(jì)算出來的
2、同一個(gè)只讀事務(wù)在執(zhí)行期間,它的指針地址是不會(huì)變的
3、如果有多個(gè)并行的只讀事務(wù),每個(gè)事務(wù)的trx變量的指針地址肯定是不同的
4、加上2^48的目的:保證只讀事務(wù)顯示的trx_id值比較大,用于區(qū)別普通的讀寫事務(wù)
5、trx_id與row_id的邏輯類似,定義長(zhǎng)度為8 Bytes
6、只讀事務(wù)不分配trx_id的好處
7、max_trx_id會(huì)持久化存儲(chǔ),重啟不會(huì)重置為0,只有到達(dá)2^48-1的上限后,才會(huì)重置為0
thread_id
1、SHOW PROCESSLIST的第一列就是thread_id
2、系統(tǒng)保存了一個(gè)環(huán)境變量thread_id_counter
3、thread_id_counter定義為4 Bytes,因此達(dá)到2^32-1后就會(huì)重置為0
do { new_id= thread_id_counter++; } while (!thread_ids.insert_unique(new_id).second);
參考資料
《MySQL實(shí)戰(zhàn)45講》
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。
網(wǎng)頁名稱:MySQL自增ID耗盡實(shí)例講解
分享網(wǎng)址:http://jinyejixie.com/article12/gpgedc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站制作、ChatGPT、域名注冊(cè)、網(wǎng)站改版、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)