使主鍵索引盡量遞增的順序,避免了頁**,因此索引更緊湊。
但不能保證是連續遞增的。
1.myisam 引擎的自增值儲存在資料檔案中
2.innodb的自增值儲存在記憶體裡,在mysql8.0之後,將自增值的變更記錄存在了redo log中,重啟時依靠redo log恢復之前的值。
當主鍵id被設為自增後,新插入記錄的id按以下規則:
1.插入記錄的id為0,null,或未指定值時,使用自增值。
2.插入記錄指定了id,就使用此id。
自增值的變化規則:
假設插入的id為x,自增值為y:
1.x<=y時,不變。
2.x>y時,y要變大。
具體演算法是從 auto_increment_offset (預設為1)開始,以 auto_increment_increment(預設為1)要插入的記錄與已存在的記錄存在唯一索引衝突,所以插入失敗,自增值並不會再改回去。為步長,持續疊加,直到找到第乙個大於 x 的值,作為新的自增值。
事務回滾時,自增值並不回退。
對於批量插入資料的語句,mysql 有乙個批量申請自增 id 的策略:舉例:語句執行過程中,第一次申請自增 id,會分配 1 個;1 個用完以後,這個語句第二次申請自增 id,會分配 2 個;2 個用完以後,還是這個語句,第三次申請自增 id,會分配 4 個;依此類推,同乙個語句去申請自增 id,每次申請到的自增 id 個數都是上一次的兩倍
insert into t values(null, 1,1)
;insert into t values(null, 2,2)
;insert into t values(null, 3,3)
;insert into t values(null, 4,4)
;create table t2 like t;
insert into t2(c,d)
select c,d from t;
insert into t2 values(null, 5,5)
;
insert…select,實際上往表 t2 中插入了 4 行資料。但是,這四行資料是分三次申請的自增 id,第一次申請到了 id=1,第二次被分配了 id=2 和 id=3, 第三次被分配到 id=4 到 id=7。由於這條語句實際只用上了 4 個 id,所以 id=5 到 id=7 就被浪費掉了。之後,再執行 insert into t2 values(null, 5,5),實際上插入的資料就是(8,5,5)。
mysql 5.1.22 版本引入了乙個新策略,新增引數 innodb_autoinc_lock_mode,預設值是 1。insert … select 是很常見的在兩個表之間拷貝資料的方法。①這個引數的值被設定為 0 時,表示採用之前 mysql 5.0 版本的策略,即語句執行結束後才釋放鎖;
②這個引數的值被設定為 1 時:普通 insert 語句,自增鎖在申請之後就馬上釋放;
類似 insert … select 這樣的批量插入資料的語句,自增鎖還是要等語句結束後才被釋放;
③這個引數的值被設定為 2 時,所有的申請自增主鍵的動作都是申請後就釋放鎖。
你需要注意,在可重複讀隔離級別下,這個語句會給 select 的表裡掃瞄到的記錄和間隙加讀鎖。
而如果 insert 和 select 的物件是同乙個表,則有可能會造成迴圈寫入。這種情況下,我們需要引入使用者臨時表來做優化。
insert 語句如果出現唯一鍵衝突,會在衝突的唯一值上加共享的 next-key lock(s 鎖)。因此,碰到由於唯一鍵約束導致報錯後,要盡快提交或回滾事務,避免加鎖時間過長。
實戰mysql45講 MySQL實戰45講
作者簡介 林曉斌,網名 丁奇 前阿里資深技術專家,曾負責阿里雲rds核心開發團隊和運維團隊,並推動了alisql分支開源。作為活躍的mysql社群貢獻者,丁奇專注於資料儲存系統 mysql原始碼研究和改進 mysql效能優化和功能改進,熱衷於解決mysql疑難問題。課程亮點 你將獲得 前阿里資深技術...
mysql 主鍵自增語句 MySQL 自增主鍵
以下僅考慮 innodb 儲存引擎。自增主鍵有兩個性質需要考慮 單調性每次插入一條資料,其 id 都是比上一條插入的資料的 id 大,就算上一條資料被刪除。連續性插入成功時,其資料的 id 和前一次插入成功時資料的 id 相鄰。自增主鍵的單調性 為何會有單調性的問題?這主要跟自增主鍵最大值的獲取方式...
MySQL設定主鍵自增和非主鍵自增
mysql 每張表只能有1個自動增長字段,這個自動增長字段即可作為主鍵,也可以用作非主鍵使用,但是請注意將自動增長字段當做非主鍵使用時必須必須為其新增唯一索引,否則系統將會報錯。例如 將自動增長字段設定為主鍵 create table t1 id int auto increment primary...