婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 深入談?wù)凪ySQL中的自增主鍵

深入談?wù)凪ySQL中的自增主鍵

熱門標(biāo)簽:電話外呼系統(tǒng)改號 啥是企業(yè)400電話辦理 地圖標(biāo)注費用是多少 曲靖移動外呼系統(tǒng)公司 南昌三維地圖標(biāo)注 武漢網(wǎng)絡(luò)外呼系統(tǒng)服務(wù)商 百應(yīng)電話機(jī)器人優(yōu)勢 怎樣在地圖標(biāo)注銷售區(qū)域 外呼系統(tǒng)打電話上限是多少

MySQL的主鍵可以是自增的,那么如果在斷電重啟后新增的值還會延續(xù)斷電前的自增值嗎?自增值默認(rèn)為1,那么可不可以改變呢?下面就說一下 MySQL的自增值。

特點

保存策略

1、如果存儲引擎是 MyISAM,那么這個自增值是存儲在數(shù)據(jù)文件中的;

2、如果是 InnoDB引擎,1)在 5.6之前是存儲在內(nèi)存中,沒有持久化,在重啟后會去找最大的鍵值,舉個例子,如果一個表當(dāng)前數(shù)據(jù)行里最大 id是10,AUTO_INCREMENT=11。這時候,我們刪除 id=10 的行,AUTO_INCREMENT 還是 11。但如果馬上重啟實例,重啟后這個表的 AUTO_INCREMENT 就會變成 10;

            2)在 8.0開始,自增值就保存在 redo log中,重啟后會從 redo log中讀取之前保存的自增值。

自增值的確定

1、如果插入數(shù)據(jù)時 id字段指定為0、null或未指定,那么就把這個表當(dāng)前的 AUTO_INCREMENT值填到自增字段,并且會以auto_increment_offset作為初始值,auto_increment_increment為步長,找出第一個大于當(dāng)前自增值的值作為新的自增值。

2、如果插入的數(shù)據(jù)的 id字段指定了具體的值,就直接使用語句里的值。

在一些場景下,使用的就不全是默認(rèn)值。比如,雙 M 的主備結(jié)構(gòu)里要求雙寫的時候,我們就可能會設(shè)置成 auto_increment_increment=2,讓一個庫的自增 id 都是奇數(shù),另一個庫的自增 id 都是偶數(shù),避免兩個庫生成的主鍵發(fā)生沖突。

自增值的修改

假設(shè)某次要輸入的值是 X,當(dāng)前的自增值是 Y。那么:

1、如果 XY,那么這個表的自增值不變;

2、如果X≥Y,那么就把當(dāng)前自增值修改為新的自增值。

執(zhí)行過程

假設(shè)有表t ,id是自增主鍵,在已有 (1,1,1)的情況下,插入一條 (null,1,1),那么執(zhí)行過程就如下:

1、執(zhí)行器調(diào)用 InnoDB 引擎接口寫入一行,傳入的這一行的值是 (0,1,1);

2、InnoDB 發(fā)現(xiàn)用戶沒有指定自增 id 的值,獲取表 t 當(dāng)前的自增值 2;

3、將傳入的行的值改成 (2,1,1);

4、將表的自增值改成 3;

5、繼續(xù)執(zhí)行插入數(shù)據(jù)操作,由于已經(jīng)存在 c=1 的記錄,所以報 Duplicate key error,語句返回。

帶來的問題

由于上面說得這種特性,在一些場景中會出現(xiàn)主鍵不連續(xù)的現(xiàn)象。

場景1:添加數(shù)據(jù)時唯一索引重復(fù)

在 c列索引重復(fù)后,原本要分配的主鍵值 2就會被丟棄,而下次再次插入就從 2 開始計算,也就變成了 3。

場景2:事務(wù)回滾

insert into t values(null,1,1);
begin;
insert into t values(null,2,2);
rollback;
insert into t values(null,2,2);
//插入的行是(3,2,2)

在第二條語句回滾后分配給其的主鍵 2也會被丟棄。

場景3:特殊批插入優(yōu)化導(dǎo)致

這里說得特殊的批插入指的是insert … select、replace … select 和 load data 語句。為什么說這些語句可能會導(dǎo)致?這就要說到自增鎖了。首先自增鎖是為了避免多線程沖突,因為在多線程下,如果同時有多個線程來獲取自增值,那么就可能會導(dǎo)致同一個自增值被分配給多條記錄,導(dǎo)致逐漸沖突。所以需要自增鎖,而為什么前面說得這些批插入語句會導(dǎo)致主鍵不連續(xù),在下面自增鎖部分會說到。

問題:在說自增鎖之前,先思考一個問題,為什么對于前兩個場景,不把自增主鍵值設(shè)為可以回滾的?這樣不就可以避免不連續(xù)了么?

答:因為設(shè)計成可回滾的會導(dǎo)致性能下降,看下面這個場景。

1、假設(shè)事務(wù) A 申請到了 id=2, 事務(wù) B 申請到 id=3,那么這時候表 t 的自增值是 4,之后繼續(xù)執(zhí)行。

2、事務(wù) B 正確提交了,但事務(wù) A 出現(xiàn)了唯一鍵沖突。

3、如果允許事務(wù) A 把自增 id 回退,也就是把表 t 的當(dāng)前自增值改回 2,那么就會出現(xiàn)這樣的情況:表里面已經(jīng)有 id=3 的行,而當(dāng)前的自增 id 值是 2。

4、接下來,繼續(xù)執(zhí)行的其他事務(wù)就會申請到 id=2,然后再申請到 id=3。這時,就會出現(xiàn)插入語句報錯“主鍵沖突”。

而為了解決上面這個問題,就需要從下面兩個方法中選一個。

方法一、每次申請 id 之前,先判斷表里面是否已經(jīng)存在這個 id。如果存在,就跳過這個 id。但是,這個方法的成本很高。因為,本來申請 id 是一個很快的操作,現(xiàn)在還要再去主鍵索引樹上判斷 id 是否存在。

方法二:把自增 id 的鎖范圍擴(kuò)大,必須等到一個事務(wù)執(zhí)行完成并提交,下一個事務(wù)才能再申請自增 id。這個方法的問題,就是鎖的粒度太大,系統(tǒng)并發(fā)能力大大下降。

所以,綜合來看,比如取消自增值回滾的功能。

自增鎖

自增鎖是為了避免在多線程中多個線程獲取到同一個主鍵值,導(dǎo)致主鍵沖突。

加鎖策略

5.0版本:范圍是語句,只有等到語句執(zhí)行完后才會釋放。

5.1.22開始:引入了一個innodb_autoinc_lock_mode參數(shù),根據(jù)參數(shù)值的不同執(zhí)行不同的策略。默認(rèn)是1。

1、參數(shù)等于0,表示采用之前的策略,即語句執(zhí)行結(jié)束就會釋放。

2、參數(shù)等于1,對于普通 insert語句,自增鎖在申請之后立馬釋放;

       對于 insert...select這樣的批量插入數(shù)據(jù)的語句,會等到語句執(zhí)行完才會釋放。加鎖范圍是 select所涉及到的范圍和間隙。

3、參數(shù)等于3,所有的申請自增主鍵的動作都是申請后就釋放鎖。

問題:為什么默認(rèn)情況下, insert...select這樣的批操作要使用語句級的鎖?為什么參數(shù)默認(rèn)不是2?

答:因為對于 insert...select這樣的批量插入數(shù)據(jù)的語句,可能會導(dǎo)致主從不一致的情況發(fā)生。

在 sessionB執(zhí)行完 "create table t2 like t"后,sessionA和 sessionB同時操作 t2。如果沒有鎖,那么執(zhí)行過程就可能會出現(xiàn)下面的情況。

session B 先插入了兩個記錄,(1,1,1)、(2,2,2);然后,session A 來申請自增 id 得到 id=3,插入了(3,5,5);之后,session B 繼續(xù)執(zhí)行,插入兩條記錄 (4,3,3)、 (5,4,4)。

雖然這樣看起來確實沒有什么問題,但是如果是在集群中,主機(jī)這樣執(zhí)行,提示 binlog是 statement格式的,那么從機(jī)執(zhí)行的順序就有可能和主機(jī)不一致,最終導(dǎo)致主從不一致。所以需要在批量插入時加鎖。而如果設(shè)置為2,那么如果 binlog不是 row,就會導(dǎo)致主從數(shù)據(jù)不一致。

所以,要想保證數(shù)據(jù)一致,也保證系統(tǒng)的并發(fā)性,可以有兩種方案:

方案一:將 binlog格式設(shè)為 statement,innodb_autoinc_lock_mode設(shè)為1。

方案二:將 binlog格式設(shè)為 row,innodb_autoinc_lock_mode設(shè)為2。一般我們?yōu)榱吮WC MySQL的高可用,都將 binlog設(shè)為 row,所以一般選擇第二種方案。

批插入的優(yōu)化

在批插入時,由于不知道一次性插入的語句有多少,如果記錄多達(dá)幾千萬甚至上億條,那么每次插入都需要分配一次自增值,這樣效率會很慢,所以 MySQL 對批操作進(jìn)行了優(yōu)化:

1、語句執(zhí)行過程中,第一次申請自增 id,會分配 1 個;

2、1 個用完以后,這個語句第二次申請自增 id,會分配 2 個;

3、2 個用完以后,還是這個語句,第三次申請自增 id,會分配 4 個;

4、依此類推,同一個語句去申請自增 id,每次申請到的自增 id 個數(shù)都是上一次的兩倍。

舉個例子,執(zhí)行下面的代碼

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 行數(shù)據(jù)。但是,這四行數(shù)據(jù)是分三次申請的自增 id,第一次申請到了 id=1,第二次被分配了 id=2 和 id=3, 第三次被分配到 id=4 到 id=7。由于這條語句實際只用上了 4 個 id,所以 id=5 到 id=7 就被浪費掉了。之后,再執(zhí)行 insert into t2 values(null, 5,5),實際上插入的數(shù)據(jù)就是(8,5,5)。這就是前面說到主鍵不連續(xù)的第三種情況。

insert...select前后操作同一個表會用到臨時表

假設(shè)有表結(jié)構(gòu)

CREATE TABLE `t` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c` int(11) DEFAULT NULL,
 `d` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;

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

如果執(zhí)行的語句是:

insert into t2(c,d) (select c+1, d from t force index(c) order by c desc limit 1);

如果我們查詢慢日志,會發(fā)現(xiàn)

掃描行數(shù)是1,也就是直接在 t上通過索引找到那一條記錄,然后插入 t2表。

如果將這條語句改成

insert into t(c,d) (select c+1, d from t force index(c) order by c desc limit 1);

那么此時查看慢日志就會發(fā)現(xiàn)變成了 5,這是為什么?就算全查出來也只會是4條,這時我們查看掃描行數(shù)的變化

發(fā)現(xiàn)前后變化是4行,所以確定了是使用了臨時表,那么就可以確定過程是:

1、創(chuàng)建臨時表,表里有兩個字段 c 和 d。

2、按照索引 c 掃描表 t,依次取 c=4、3、2、1,然后回表,讀到 c 和 d 的值寫入臨時表。這時,Rows_examined=4。

3、由于語義里面有 limit 1,所以只取了臨時表的第一行,再插入到表 t 中。這時,Rows_examined 的值加 1,變成了 5。

至于為什么需要臨時表,這是為了防止在讀取時,讀到了剛剛插入的值。

優(yōu)化

因為select返回的記錄數(shù)較少,所以可以使用內(nèi)存臨時表來優(yōu)化,

create temporary table temp_t(c int,d int) engine=memory;
insert into temp_t (select c+1, d from t force index(c) order by c desc limit 1);
insert into t select * from temp_t;
drop table temp_t;

這樣掃描的總行數(shù)只有 select的 1加上臨時表上的 1。

最后

對于唯一索引的沖突,可以使用insert into … on duplicate key update來進(jìn)行沖突后的更新處理,假設(shè)表 t中有(1,1,1)、(2,2,2)兩條記錄,那么執(zhí)行:

在插入時發(fā)現(xiàn)沖突就對沖突的記錄進(jìn)行修改操作。

總結(jié)

到此這篇關(guān)于MySQL中的自增主鍵的文章就介紹到這了,更多相關(guān)MySQL自增主鍵內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Mysql主鍵UUID和自增主鍵的區(qū)別及優(yōu)劣分析
  • MySQL的主鍵命名策略相關(guān)
  • 淺談MySQL中的自增主鍵用完了怎么辦
  • MySQL的自增ID(主鍵) 用完了的解決方法
  • 深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵
  • 詳解MySQL 表中非主鍵列溢出情況監(jiān)控
  • 使用prometheus統(tǒng)計MySQL自增主鍵的剩余可用百分比
  • Mysql 增加主鍵或者修改主鍵的sql語句操作

標(biāo)簽:資陽 荊州 吉林 錦州 滄州 甘南 隨州 黑河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《深入談?wù)凪ySQL中的自增主鍵》,本文關(guān)鍵詞  深入,談?wù)?MySQL,中的,自增,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《深入談?wù)凪ySQL中的自增主鍵》相關(guān)的同類信息!
  • 本頁收集關(guān)于深入談?wù)凪ySQL中的自增主鍵的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩国产系列| 欧美一区二区三区播放老司机| 色婷婷综合五月| 国产精品福利av| 91小视频免费观看| 亚洲综合免费观看高清完整版在线| 91在线观看美女| 亚洲一区欧美一区| 日韩欧美一卡二卡| 国产成人精品免费| 一区二区三区欧美激情| 欧美中文字幕一区二区三区亚洲 | 五月综合激情日本mⅴ| 欧美日韩一二区| 久久精品国产免费| 国产精品视频一二三| 欧美亚洲一区二区在线| 青青青伊人色综合久久| 国产欧美日韩另类一区| 在线观看91视频| 国产成人午夜高潮毛片| 亚洲福利视频一区| 国产日产精品1区| 欧美日韩不卡在线| 成人av午夜电影| 日韩国产精品久久久| 中文字幕不卡一区| 欧美一区二区三区四区在线观看| 白白色 亚洲乱淫| 久久99精品久久久久久国产越南| 中文字幕一区视频| 日韩一区和二区| 在线观看成人小视频| 成人国产精品免费观看视频| 麻豆一区二区三区| 亚洲尤物视频在线| 日韩理论片在线| 国产欧美视频一区二区| 7777精品久久久大香线蕉| 91在线免费播放| 高清成人免费视频| 狠狠色丁香婷综合久久| 日本一不卡视频| 亚洲国产精品久久久久秋霞影院| 国产精品美女久久久久av爽李琼| xfplay精品久久| 欧美成人精品高清在线播放| 欧美日韩国产中文| 一本色道**综合亚洲精品蜜桃冫 | 久久久久久久免费视频了| 欧美精品成人一区二区三区四区| 国产**成人网毛片九色 | 亚洲伦理在线精品| 日本一区二区三区国色天香| 欧美成人国产一区二区| 精品视频一区二区不卡| 色婷婷激情久久| 97国产一区二区| 99国产精品久久久久久久久久| 国产福利精品导航| 国产一区二区日韩精品| 国产成人综合在线| 国产精品1区2区3区在线观看| 国模娜娜一区二区三区| 经典三级视频一区| 国产一区二区三区蝌蚪| 高清在线成人网| 成人激情小说网站| 欧美日韩国产a| 日本福利一区二区| 色悠悠亚洲一区二区| 色综合一区二区三区| 欧美亚洲综合色| 91麻豆精品国产91| 精品久久久久久最新网址| 久久久久久日产精品| 国产精品国产三级国产aⅴ原创 | 91免费观看视频| 在线观看日韩电影| 91精品国产综合久久精品性色| 欧美一区二区三区在线电影| 久久嫩草精品久久久久| 最新成人av在线| 奇米在线7777在线精品| 国产精品99久久久久久有的能看 | 久久精品亚洲精品国产欧美kt∨| 国产精品美女www爽爽爽| 亚洲精品videosex极品| 蜜桃一区二区三区四区| 国产成人精品亚洲777人妖 | 不卡av电影在线播放| 97久久超碰精品国产| 欧美日韩国产中文| 欧美激情一区二区三区不卡| 亚洲午夜av在线| 久久se精品一区精品二区| 成人黄色软件下载| 在线播放中文字幕一区| 国产精品久久久久精k8| 日韩影院精彩在线| av网站免费线看精品| 91精品国产综合久久久久久漫画| 国产精品麻豆99久久久久久| 日韩avvvv在线播放| 9色porny自拍视频一区二区| 欧美一级高清片| 一区二区三区丝袜| 国产一区91精品张津瑜| 欧美午夜精品久久久| 国产欧美一区二区精品久导航| 日本成人中文字幕| 在线一区二区三区四区五区| 久久久久久亚洲综合| 色综合久久中文字幕综合网| 久久亚洲影视婷婷| 日韩专区欧美专区| 91在线视频官网| 欧美激情综合五月色丁香| 九九精品视频在线看| 欧美精品日韩精品| 亚洲国产日韩综合久久精品| 国产不卡在线一区| 久久青草国产手机看片福利盒子| 午夜激情一区二区| 在线观看亚洲a| 亚洲免费在线观看视频| 99视频一区二区| 最新热久久免费视频| 成人精品一区二区三区中文字幕| 欧美精品一区二区三区四区| 日韩 欧美一区二区三区| 91精品国产高清一区二区三区蜜臀| 一区二区三区高清不卡| 在线亚洲人成电影网站色www| 国产精品美女久久久久av爽李琼| 国产一区二区三区久久悠悠色av| 精品国产91亚洲一区二区三区婷婷| 蜜臀久久久久久久| 亚洲精品一区二区三区精华液 | 国内精品国产成人| 久久综合色婷婷| 国产精品2024| 中文字幕在线观看一区| 色哟哟在线观看一区二区三区| 亚洲精品日日夜夜| 欧美性大战久久| 三级不卡在线观看| 精品国产不卡一区二区三区| 国产成人在线观看| 国产精品不卡在线| 精品视频资源站| 美女高潮久久久| 欧美高清在线一区| 色综合色狠狠综合色| 亚洲一区av在线| 精品日韩一区二区三区| 高清在线观看日韩| 亚洲午夜免费电影| 亚洲精品在线免费播放| 99久精品国产| 午夜精品一区二区三区三上悠亚 | 精品视频一区 二区 三区| 久久se精品一区精品二区| 一区在线播放视频| 欧美久久婷婷综合色| 国产乱淫av一区二区三区| 亚洲精品免费在线| 日韩免费观看2025年上映的电影| 国产福利一区二区三区| 亚洲高清三级视频| 26uuu欧美| 在线中文字幕一区二区| 国产精品影视网| 亚洲大型综合色站| 国产精品美女一区二区三区| 91精品在线免费| 91国产视频在线观看| 国产一区二三区| 五月婷婷激情综合| 亚洲欧洲精品成人久久奇米网| 日韩一级二级三级| 91福利在线观看| 福利一区二区在线观看| 日本成人在线视频网站| 一区二区三区精品视频在线| 国产日韩欧美激情| 欧美一卡2卡3卡4卡| 欧美午夜不卡在线观看免费| 粉嫩av亚洲一区二区图片| 麻豆一区二区在线| 日产精品久久久久久久性色| 亚洲一区在线观看视频| 亚洲三级免费电影| 国产欧美日韩精品一区| 精品剧情在线观看| 欧美一区二区三区视频| 91久久精品午夜一区二区| 成人免费精品视频| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲欧美成aⅴ人在线观看 |