一、什麼是InnoDB Auto-Increment鎖模式
InnoDB Auto-Increment鎖模式是MySQL InnoDB存儲引擎控制自增ID並發更新的一種機制。在MySQL的生態圈中,自增ID是常見的用於唯一標識數據的方式。多個並發的事務同時插入記錄,若選擇的主鍵是自增ID,那麼就會產生碰撞。InnoDB引擎提出了自增鎖模式來解決這個問題。
二、InnoDB Auto-Increment鎖模式的分類
在MySQL 5.1之前有四種自增鎖模式,分別為:0、1、2、3;自MySQL 5.1之後,為了提升自增ID的並發性能,又在原有的模式上增加了4這一模式。
三、InnoDB Auto-Increment鎖模式的不同
每種模式都有自身的優缺點,需要根據具體情況進行選擇。以下是InnoDB Auto-Increment鎖模式的具體描述:
1. 鎖模式0
如果使用的是這種鎖模式,將不會對自增ID加鎖,而是基於隨機數或時間來保證唯一。這在低並發情況下表現良好,但在高並發場景下很容易發生碰撞現象,性能下降。
-- 示例代碼 CREATE TABLE `demo_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2. 鎖模式1
這種鎖模式下InnoDB將會在插入記錄時對自增ID進行加鎖。雖然能夠避免碰撞,但是同時也會導致並發插入性能下降,因為每個插入操作都會在插入時對錶加鎖,該表的其他操作也必須等到該插入操作結束後才可以繼續進行。
-- 示例代碼 CREATE TABLE `demo_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC innodb_autoinc_lock_mode=1;
3. 鎖模式2
這種鎖模式下InnoDB將會在插入記錄時對自增ID進行加鎖。但在外鍵存在時,外鍵索引上的鎖應該比自增鎖更為緊密,提高並發性能。但是這種鎖模式下如果有自增ID的聯合索引時,需要做一些特殊的優化,否則性能也會下降。
-- 示例代碼 CREATE TABLE `demo_table1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC innodb_autoinc_lock_mode=2; CREATE TABLE `demo_table2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `assoc_id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_assoc_id` (`assoc_id`), CONSTRAINT `fk_demo_table1_assoc_id` FOREIGN KEY (`assoc_id`) REFERENCES `demo_table1` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC innodb_autoinc_lock_mode=2;
4. 鎖模式3
這種鎖模式下InnoDB將會在主鍵索引上對自增ID進行加鎖,但是只有在事務提交時才會加鎖。它僅在innodb_autoinc_lock_mode=1或2時起作用。在這種模式下,InnoDB會緩存大量的自增ID值,這意味着大部分插入操作不需要對錶進行加鎖,提高了並發插入的性能。但在事務提交時,InnoDB會將緩存中的ID和當前最大值進行比較,確保緩存ID的準確性。
-- 示例代碼 CREATE TABLE `demo_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC innodb_autoinc_lock_mode=3;
5. 鎖模式4
這種鎖模式是MySQL 5.1版本引入的新的鎖模式,它是在鎖模式3的基礎上進行優化的。它通過同時使用間隙鎖和插入意向鎖來提高並發性能。但是如果使用了外鍵或存在自增ID聯合索引時,性能可能也會受到影響。
-- 示例代碼 CREATE TABLE `demo_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC innodb_autoinc_lock_mode=4;
四、總結
InnoDB Auto-Increment鎖模式是InnoDB存儲引擎控制自增ID並發更新的機制,通過合理的選擇InnoDB Auto-Increment鎖模式,可以提高並發性能。
原創文章,作者:EDLI,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/148212.html