mysql auto_increment 原理_[Mysql]mysql原理之Auto_increment
2019獨角獸企業重金招聘Python工程師標準>>>
引言
MySQL中auto_increment字段估計大家都經常用到,特別是innodb引擎。我也經常用,只知道mysql可以保證這個字段在多進程操作時的原子性,具體原理又是什么,后來查閱了MySQL手冊以及相關資料,了解了個大概。
本文只探究了mysql5.5中innodb引擎auto_increment的問題。
定義
使用auto_increment的字段可能生成唯一的標識。
如何使用
可在建表時可用“AUTO_INCREMENT=n”選項來指定一個自增的初始值。
可用alter table table_name AUTO_INCREMENT=n命令來重設自增的起始值。
使用規范
AUTO_INCREMENT是數據列的一種屬性,只適用于整數類型數據列。
設置AUTO_INCREMENT屬性的數據列應該是一個正數序列,所以應該把該數據列聲明為UNSIGNED,這樣序列的編號個可增加一倍。
AUTO_INCREMENT數據列必須有唯一索引,以避免序號重復(即是主鍵或者主鍵的一部分)。
AUTO_INCREMENT數據列必須具備NOT NULL屬性。
AUTO_INCREMENT數據列序號的最大值受該列的數據類型約束,如TINYINT數據列的最大編號是127,如加上UNSIGNED,則最大為255。一旦達到上限,
AUTO_INCREMENT就會失效。
當進行全表刪除時,MySQL AUTO_INCREMENT會從1重新開始編號。全表刪除的意思是發出以下兩條語句時: delete from table_name;
或者
truncate table table_name
原理(這里面是重點)
傳統auto_increment原理
mysql innodb引擎的表中的auto_increment字段是通過在內存中維護一個auto-increment計數器,來實現該字段的賦值,注意自增字段必須是索引,而且是索引的第一列,不一定要是主鍵。例如我現在在我的數據庫test中創建一個表t,語句如下: CREATE TABLE `t_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='測試表'
則字段a為auto_increment類型,在mysql服務器啟動后,第一次插入數據到表t_test時,InnoDB引擎會執行等價于下面的語句: SELECT MAX(id) FROM t FOR UPDATE;
Innodb獲取到當前表中id字段的最大值并將增加1(默認是增加1,如果要調整為增加其他數目,可以設置auto_increment_increment這個配置的設置)然后賦值給該列以及內存中該表對應的計數器
在傳統的auto_increment設置中,每次訪問auto-increment計數器的時候, INNODB都會加上一個名為AUTO-INC鎖直到該語句結束(注意鎖只持有到語句結束,不是事務結束).AUTO-INC鎖是一個特殊的表級別的鎖,用來提升包含auto_increment列的并發插入性能.因此,兩個事務不能同時獲取同一個表上面的AUTO-INC鎖,如果持有AUTO-INC鎖太長時間可能會影響到數據庫性能(比如INSERT INTO t1... SELECT ... FROM t2這類語句).
改進后
基于上面傳統方式的問題(性能太差),在mysql5.1開始,新增加了一個配置項innodb_autoinc_lock_mode來設定auto_increment方式.
可以設置的值為0,1,2.其中0就是第一節中描述的傳統auto_increment機制,而1和2則是新增加的模式,默認該值為1,可以中mysql配置文件中修改該值.這里主要來看看這兩種新的方式的差別;
在描述差別前需要先明確幾個插入類型:
simple inserts
能夠確定具體的插入行數的語句。
bulk inserts
事先無法確定插入行數的語句
mixed-mode inserts
有些行指定了auto_increment列的值有些沒有指定
下面看看設置innodb_autoinc_lock_mode為不同值時的情況:
innodb_autoinc_lock_mode=0(traditional lock mode)
傳統的auto_increment機制,這種模式下所有針對auto_increment列的插入操作都會加AUTO-INC鎖,分配的值也是一個個分配,是連續的,正常情況下也不會有間隙(當然如果事務rollback了這個auto_increment值就會浪費掉,從而造成間隙)。
innodb_autoinc_lock_mode=1(consecutive lock mode)
這種情況下,針對bulk inserts才會采用AUTO-INC鎖這種方式,而針對simple inserts,則采用了一種新的輕量級的互斥鎖來分配auto_increment列的值。當然,如果其他事務已經持有了AUTO-INC鎖,則simple inserts需要等待.
需要注意的是,在innodb_autoinc_lock_mode=1時,語句之間是可能出現auto_increment值的間隔的。比如mixed-mode inserts以及bulk inserts中都有可能導致一些分配的auto_increment值被浪費掉從而導致間隙。后面會有例子。
innodb_autoinc_lock_mode=2(interleaved lock mode)
這種模式下任何類型的inserts都不會采用AUTO-INC鎖,性能最好,但是在同一條語句內部產生auto_increment值間隙。此外,這種模式對statement-based replication也不安全。
總結
以上是生活随笔為你收集整理的mysql auto_increment 原理_[Mysql]mysql原理之Auto_increment的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssdp协议 upnp_SSDP 简单服
- 下一篇: Dws同步mysql数据_数据库技术丨G