您好,登錄后才能下訂單哦!
顯示定義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表,每插入一行數據
3、代碼實現上,row_id是一個8 Bytes的BIGINT UNSIGNED
4、在InnoDB里面,申請到row_id=N后,就將這行數據寫入表中
5、推薦顯示創建自增主鍵
XID
1、redolog和binlog相配合的時候,有一個共同的字段XID,對應一個事務
2、生成邏輯
3、global_query_id是一個純內存變量,重啟之后清零
4、global_query_id是8 Bytes,上限為2^64-1
InnoDB trx_id
1、XID是由Server層維護的
2、InnoDB內部使用的是trx_id,為的是能夠在InnoDB事務和Server層之間做關聯
3、InnoDB內部維護一個max_trx_id的全局變量
4、InnoDB數據可見性的核心思想
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并未涉及更新操作,是一個只讀事務
4、session A在T3時刻執行INSERT語句時,InnoDB才真正分配trx_id
只讀事務
1、在上面的T2時刻,很大的trx_id是由系統臨時計算出來的
2、同一個只讀事務在執行期間,它的指針地址是不會變的
3、如果有多個并行的只讀事務,每個事務的trx變量的指針地址肯定是不同的
4、加上2^48的目的:保證只讀事務顯示的trx_id值比較大,用于區別普通的讀寫事務
5、trx_id與row_id的邏輯類似,定義長度為8 Bytes
6、只讀事務不分配trx_id的好處
7、max_trx_id會持久化存儲,重啟不會重置為0,只有到達2^48-1的上限后,才會重置為0
thread_id
1、SHOW PROCESSLIST的第一列就是thread_id
2、系統保存了一個環境變量thread_id_counter
3、thread_id_counter定義為4 Bytes,因此達到2^32-1后就會重置為0
do { new_id= thread_id_counter++; } while (!thread_ids.insert_unique(new_id).second);
參考資料
《MySQL實戰45講》
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。