日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql auto_increment 原理_[Mysql]mysql原理之Auto_increment

發布時間:2024/1/23 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。