您好,登錄后才能下訂單哦!
顯示定義ID
表定義的自增值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è)不可見的,長度為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的邏輯類似,定義長度為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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。