亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

mysql自增id超大問(wèn)題的排查與解決

2024-07-25 19:09:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

引言

小A正在balabala寫(xiě)代碼呢,DBA小B突然發(fā)來(lái)了一條消息,“快看看你的用戶特定信息表T,里面的主鍵,也就是id/268849.html">自增id,都到16億了,這才多久,在這樣下去過(guò)不了多久主鍵就要超出范圍了,插入就會(huì)失敗,balabala......”

我記得沒(méi)有這么多,最多1k多萬(wàn),count了下,果然是1100萬(wàn)。原來(lái)運(yùn)維是通過(guò)auto_increment那個(gè)值看的,就是說(shuō),表中有大量的刪除插入操作,但是我大部分情況都是更新的,怎么會(huì)這樣?

下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

問(wèn)題排查

這張表是一個(gè)簡(jiǎn)單的接口服務(wù)在使用,每天大數(shù)據(jù)會(huì)統(tǒng)計(jì)一大批信息,然后推送給小A,小A將信息更新到數(shù)據(jù)庫(kù)中,如果是新數(shù)據(jù)就插入,舊數(shù)據(jù)就更新之前的數(shù)據(jù),對(duì)外接口就只有查詢了。

很快,小A就排查了一遍自己的代碼,沒(méi)有刪除的地方,也沒(méi)有主動(dòng)插入、更新id的地方,怎么會(huì)這樣呢?難道是小B的原因,也不太可能,DBA那邊兒管理很多表,有問(wèn)題的話早爆出來(lái)了,但問(wèn)題在我這里哪里也沒(méi)頭緒。

小A又仔細(xì)觀察了這1000多萬(wàn)已有的數(shù)據(jù),將插入時(shí)間、id作為主要觀察字段,很快,發(fā)現(xiàn)了個(gè)問(wèn)題,每天第一條插入的數(shù)據(jù)總是比前一天多1000多萬(wàn),有時(shí)候遞增的多,有時(shí)候遞增的少,小A又將矛頭指向了DBA小B,將問(wèn)題又給小B描述了一遍。

小B問(wèn)了小A,“你是是不是用了REPLACE INTO ...語(yǔ)句”,這是怎么回事呢,原來(lái)REPLACE INTO ...會(huì)對(duì)主鍵有影響。

REPLACE INTO ...對(duì)主鍵的影響

假設(shè)有一張表t1:

CREATE TABLE `t1` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID,自增',`uid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用戶uid',`name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶昵稱',PRIMARY KEY (`id`),UNIQUE KEY `u_idx_uid` (`uid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='測(cè)試replace into';

如果新建這張表,執(zhí)行下面的語(yǔ)句,最后的數(shù)據(jù)記錄如何呢?

insert into t1 values(NULL, 100, "test1"),(NULL, 101, "test2");replace into t1 values(NULL, 100, "test3");

mysql,自增,id,超大

原來(lái),REPLACE INTO ...每次插入的時(shí)候如果唯一索引對(duì)應(yīng)的數(shù)據(jù)已經(jīng)存在,會(huì)刪除原數(shù)據(jù),然后重新插入新的數(shù)據(jù),這也就導(dǎo)致id會(huì)增大,但實(shí)際預(yù)期可能是更新那條數(shù)據(jù)。

小A說(shuō):“我知道replace是這樣,所有既沒(méi)有用它”,但還是又排查了一遍,確實(shí)不是自己的問(wèn)題,沒(méi)有使用REPLACE INTO ...,

小A又雙叒叕仔細(xì)的排查了一遍,還是沒(méi)發(fā)現(xiàn)問(wèn)題,就讓小B查下binlog日志,看看是不是有什么奇怪的地方,查了之后還是沒(méi)發(fā)現(xiàn)問(wèn)題,確實(shí)存在跳躍的情況,但并沒(méi)有實(shí)質(zhì)性的問(wèn)題。

下圖中@1的值對(duì)應(yīng)的是自增主鍵id,用(@2, @3)作為唯一索引

mysql,自增,id,超大

后來(lái)過(guò)了很久,小B給小A指了個(gè)方向,小A開(kāi)始懷疑自己的插入更新語(yǔ)句INSERT ... ON DUPLICATE KEY UPDATE ...了,查了許久,果然是這里除了問(wèn)題。

INSERT ... ON DUPLICATE KEY UPDATE ...對(duì)主鍵的影響

這個(gè)語(yǔ)句跟REPLACE INTO ...類似,不過(guò)他并不會(huì)變更該條記錄的主鍵,還是上面t1這張表,我們執(zhí)行下面的語(yǔ)句,執(zhí)行完結(jié)果是什么呢?

insert into t1 values(NULL, 100, "test4") on duplicate key update name = values(name);

mysql,自增,id,超大

沒(méi)錯(cuò),跟小A預(yù)想的一樣,主鍵并沒(méi)有增加,而且name字段已經(jīng)更新為想要的了,但是執(zhí)行結(jié)果有條提示,引起了小A的注意

No errors; 2 rows affected, taking 10.7ms

明明更新了一條數(shù)據(jù),為什么這里的影響記錄條數(shù)是2呢?小A,又看了下目前表中的auto_increment

CREATE TABLE `t1` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID,自增',`uid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用戶uid',`name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶昵稱',PRIMARY KEY (`id`),UNIQUE KEY `u_idx_uid` (`uid`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='測(cè)試replace into';

竟然是5`,這里本應(yīng)該是4的。

也就是說(shuō),上面的語(yǔ)句,會(huì)跟REPLACE INTO ...類似的會(huì)將自增ID加1,但實(shí)際記錄沒(méi)有加,這是為什么呢?

查了資料之后,小A得知,原來(lái),mysql主鍵自增有個(gè)參數(shù)innodb_autoinc_lock_mode,他有三種可能只0,1,2,mysql5.1之后加入的,默認(rèn)值是1,之前的版本可以看做都是0。

可以使用下面的語(yǔ)句看當(dāng)前是哪種模式

select @@innodb_autoinc_lock_mode;

小A使用的數(shù)據(jù)庫(kù)默認(rèn)值也是1,當(dāng)做簡(jiǎn)單插入(可以確定插入行數(shù))的時(shí)候,直接將auto_increment加1,而不會(huì)去鎖表,這也就提高了性能。當(dāng)插入的語(yǔ)句類似insert into select ...這種復(fù)雜語(yǔ)句的時(shí)候,提前不知道插入的行數(shù),這個(gè)時(shí)候就要要鎖表(一個(gè)名為AUTO_INC的特殊表鎖)了,這樣auto_increment才是準(zhǔn)確的,等待語(yǔ)句結(jié)束的時(shí)候才釋放鎖。還有一種稱為Mixed-mode inserts的插入,比如INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d'),其中一部分明確指定了自增主鍵值,一部分未指定,還有我們這里討論的INSERT ... ON DUPLICATE KEY UPDATE ...也屬于這種,這個(gè)時(shí)候會(huì)分析語(yǔ)句,然后按盡可能多的情況去分配auto_incrementid,這個(gè)要怎么理解呢,我看下面這個(gè)例子:

truncate table t1;insert into t1 values(NULL, 100, "test1"),(NULL, 101, "test2"),(NULL, 102, "test2"),(NULL, 103, "test2"),(NULL, 104, "test2"),(NULL, 105, "test2");-- 此時(shí)數(shù)據(jù)表下一個(gè)自增id是7delete from t1 where id in (2,3,4);-- 此時(shí)數(shù)據(jù)表只剩1,5,6了,自增id還是7insert into t1 values(2, 106, "test1"),(NULL, 107, "test2"),(3, 108, "test2");-- 這里的自增id是多少呢?

上面的例子執(zhí)行完之后表的下一個(gè)自增id是10,你理解對(duì)了嗎,因?yàn)樽詈笠粭l執(zhí)行的是一個(gè)Mixed-mode inserts語(yǔ)句,innoDB會(huì)分析語(yǔ)句,然后分配三個(gè)id,此時(shí)下一個(gè)id就是10了,但分配的三個(gè)id并不一定都使用。此處 @總是遲到 多謝指出,看官方文檔理解錯(cuò)了

模式0的話就是不管什么情況都是加上表鎖,等語(yǔ)句執(zhí)行完成的時(shí)候在釋放,如果真的添加了記錄,將auto_increment加1。

至于模式2,什么情況都不加AUTO_INC鎖,存在安全問(wèn)題,當(dāng)binlog格式設(shè)置為Statement模式的時(shí)候,從庫(kù)同步的時(shí)候,執(zhí)行結(jié)果可能跟主庫(kù)不一致,問(wèn)題很大。因?yàn)榭赡苡幸粋€(gè)復(fù)雜插入,還在執(zhí)行呢,另外一個(gè)插入就來(lái)了,恢復(fù)的時(shí)候是一條條來(lái)執(zhí)行的,就不能重現(xiàn)這種并發(fā)問(wèn)題,導(dǎo)致記錄id可能對(duì)不上。

至此,id跳躍的問(wèn)題算是分析完了,由于innodb_autoinc_lock_mode值是1,INSERT ... ON DUPLICATE KEY UPDATE ...是簡(jiǎn)單的語(yǔ)句,預(yù)先就可以計(jì)算出影響的行數(shù),所以不管是否更新,這里都將auto_increment加1(多行的話大于1)。

如果將innodb_autoinc_lock_mode值改為0,再次執(zhí)行INSERT ... ON DUPLICATE KEY UPDATE ...的話,你會(huì)發(fā)現(xiàn)auto_increment并沒(méi)有增加,因?yàn)檫@種模式直接加了AUTO_INC鎖,執(zhí)行完語(yǔ)句的時(shí)候釋放,發(fā)現(xiàn)沒(méi)有增加行數(shù)的話,不會(huì)增加自增id的。

INSERT ... ON DUPLICATE KEY UPDATE ...影響的行數(shù)是1為什么返回2?

為什么會(huì)這樣呢,按理說(shuō)影響行數(shù)就是1啊,看看官方文檔的說(shuō)明

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values

官方明確說(shuō)明了,插入影響1行,更新影響2行,0的話就是存在且更新前后值一樣。是不是很不好理解?

其實(shí),你要這樣想就好了,這是為了區(qū)分到底是插入了還是更新了,返回1表示插入成功,2表示更新成功。

解決方案

將innodb_autoinc_lock_mode設(shè)置為0肯定可以解決問(wèn)題,但這樣的話,插入的并發(fā)性可能會(huì)受很大影響,因此小A自己想著DBA也不會(huì)同意。經(jīng)過(guò)考慮,目前準(zhǔn)備了兩種較為可能的解決方案:

修改業(yè)務(wù)邏輯

修改業(yè)務(wù)邏輯,將INSERT ... ON DUPLICATE KEY UPDATE ...語(yǔ)句拆開(kāi),先去查詢,然后去更新,這樣就可以保證主鍵不會(huì)不受控制的增大,但增加了復(fù)雜性,原來(lái)的一次請(qǐng)求可能變?yōu)閮纱危炔樵冇袥](méi)有,然后去更新。

刪除表的自增主鍵

刪除自增主鍵,讓唯一索引來(lái)做主鍵,這樣子基本不用做什么變動(dòng),只要確定目前的自增主鍵沒(méi)有實(shí)際的用處即可,這樣的話,插入刪除的時(shí)候可能會(huì)影響效率,但對(duì)于查詢多的情況來(lái)說(shuō),小A比較兩種之后更愿意選擇后者。

結(jié)語(yǔ)

其實(shí)INSERT ... ON DUPLICATE KEY UPDATE ...這個(gè)影響行數(shù)是2的,小A很早就發(fā)現(xiàn)了,只是沒(méi)有保持好奇心,不以為然罷了,沒(méi)有深究其中的問(wèn)題,這深究就起來(lái)會(huì)帶出來(lái)一大串新知識(shí),挺好,看來(lái)小A還是要對(duì)外界保持好奇心,保持敏感,這樣才會(huì)有進(jìn)步。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到MYSQL教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
x88av蜜桃臀一区二区| 国产精品久久久久影院| 亚洲电影在线免费观看| 91文字幕巨乱亚洲香蕉| 久久久久久国产精品美女| 欧美日韩一区二区三区在线免费观看| 亚洲第一二三区| 大胆国模一区二区三区| 蜜臀视频一区二区三区| 久久成人小视频| 毛片在线网址| 在线视频欧美日韩精品| 人妻中文字幕一区| 97se在线视频| 影音先锋欧美在线| 亚洲欧洲av色图| 久久中文字幕无码| 亚洲色图另类小说| 农村少妇一区二区三区四区五区| 亚洲欧美日韩久久久久久| 少妇高潮喷水久久久久久久久久| 日韩av男人天堂| 欧美性在线观看| 国产精品日本一区二区三区在线| 久久99久久久久| 美女视频一区在线观看| 樱桃成人精品视频在线播放| 性欧美video另类hd尤物| 91香蕉国产在线观看软件| 久久久久久国产视频| 精品爆乳一区二区三区无码av| 亚洲欧洲中文字幕| 日韩久久一区二区| 久久福利影视| 久久香蕉av| 99re8这里只有精品| 成人精品3d动漫| 欧美v日韩v国产v| 亚洲欧洲一二区| 色狠狠一区二区三区香蕉| 久久精品五月| 国产成人av自拍| 136av视频导航| 欧美制服第一页| 91精品久久香蕉国产线看观看| 亚洲一区二区欧美| 草久久免费视频| swag国产精品一区二区| 少妇户外露出[11p]| 国产毛片毛片毛片毛片毛片毛片| 久久精品视频播放| 日韩av自拍| 国产91绿帽单男绿奴| 成人欧美一区二区三区视频| youjizzjizz亚洲| 中文字幕无码乱码人妻日韩精品| 亚洲高清av| 蜜桃视频欧美| 传媒视频在线| 欧美一区二区三区日韩视频| 亚洲欧洲成人精品av97| 新片速递亚洲合集欧美合集| 天天干天天干天天| 国产精品福利在线观看| 日韩一二区视频| 韩日一区二区| 日韩欧美一区二区三区久久婷婷| 一个人看的免费视频色| 精品国产一区二区亚洲人成毛片| 国产一区二区精品福利地址| 亚洲国产精品天堂| 中文在线中文字幕| 日韩在线观看一区| 原创国产精品91| 九九99精品| 欧美一级成年大片在线观看| 亚洲男人天堂一区| 亚洲四色影视在线观看| 五月婷婷另类国产| 99高清免费国产自产拍| 蜜臀av性久久久久蜜臀aⅴ| 色视频在线看| 国产av无码专区亚洲av毛网站| 99在线热播精品免费| 国产精品欧美激情| 国产精品无码网站| 日韩欧美国产一二三区| 伊人久久在线| 制服丝袜日韩国产| 高清在线成人网| 国产清纯白嫩初高生在线观看91| 日本在线三级| 中文字幕av一区二区三区佐山爱| 性视频1819p久久| 亚洲黄色小说图片| 在线一区av| 艳妇乳肉豪妇荡乳av| av电影天堂一区二区在线| 强乱中文字幕av一区乱码| 欧美成人片在线| 欧美日韩天堂| 一区二区导航| 99高清免费国产自产拍| 天堂在线视频免费| 一本色道久久99精品综合| 伊人影院在线视频| 国产精品人妻一区二区三区| 一级毛片视频在线观看| 亚洲美女偷拍久久| 国产视频亚洲精品| 肉肉av福利一精品导航| 俄罗斯嫩小性bbwbbw| 日韩一区二区精品葵司在线| 色噜噜夜夜夜综合网| 国产精品一区二区三| 免费在线成人av电影| 日本乱人伦aⅴ精品| 中文在线字幕在线观看| 亚洲国产成人精品一区二区| 91丨国产丨九色丨pron| 男女男精品视频站| 国内精品久久久久久久影视麻豆| 99国产精品白浆在线观看免费| 亚洲裸色大胆大尺寸艺术写真| yellow网站在线观看| 一区视频免费观看| 午夜精品久久久久久久蜜桃app| 国产精品视频一区二区三区经| 亚洲色图17p| 国产伦精品一区二区三区妓女| 私库av在线播放| 国产cdts系列另类在线观看| 蝌蚪视频在线播放| 日本道色综合久久影院| 91久久人澡人人添人人爽欧美| 国内小视频在线看| 中文字幕欧美三区| 午夜激情一区二区三区| 久久精品免费播放| 精品国产三级a∨在线| 大地资源网3页在线观看| 欧美在线视频网| 精品一区二区三区免费观看| 国产精品毛片无遮挡高清| 国产乱码精品一区二三区蜜臂| 亚洲精品蜜桃乱晃| 99不卡视频| 精品一区二区在线免费观看| 欧美一级二级三级蜜桃| 黄色a级在线观看| 日韩高清在线播放| 99精品视频免费观看| 国产精品久久久久久久无码| 成人黄色在线观看| 一级α片免费看刺激高潮视频| 久久久无码精品亚洲国产| 欧美专区在线视频| 在线精品视频视频中文字幕| 日本最新中文字幕| 久久人妻一区二区| 在线观看中文字幕码| 精品视频国内| 亚洲三级电影| 婷婷在线观看视频| 日韩综合第一页| 久久久久久久久久久久久久久国产| 欧美美最猛性xxxxxx| 国产在线精品一区二区不卡| 精品欧美乱码久久久久久1区2区| 亚洲图片123| 手机在线成人免费视频| 777精品伊人久久久久大香线蕉| 中文字幕人妻熟女人妻a片| 美女被黑人40厘米进入| 日本高清视频网站www| 日韩精品极品| 成人黄色片在线观看| 在线观看免费成人av| 日韩久久久久久久久久久久| 亚洲欧洲中文字幕| www.中文字幕在线观看| 国产高潮又爽又无遮挡又免费| 天天做天天躁天天躁| 国产精品午夜久久久久久| 国产精品欧美一区二区| 久久久亚洲成人| 亚洲综合好骚| www.久久久久久久久| 亚洲黄色录像| 免费福利视频网站| 欧美高清hd18日本| 久热re这里精品视频在线6| 五月天激情丁香| 天天综合网天天综合| 亚洲精品国产成人影院| 日韩香蕉视频| 色狠狠一区二区三区| 你懂的亚洲视频| 亚洲人成网站精品片在线观看| 一区二区三区 在线观看视| 黄色在线视频网站| 欧美黄色一级视频| 欧美精品精品一区| 一区二区三区日韩精品视频| 午夜在线视频观看日韩17c| 午夜剧场免费在线观看| 精品一区电影| 全程偷拍露脸中年夫妇| 超碰在线国产97| 一区二区三区欧美在线观看| 潘金莲激情呻吟欲求不满视频| 日韩亚洲不卡在线| 亚洲黄色小说图片| 日韩成人伦理| 国产日韩欧美另类| 激情五月婷婷综合网| 少妇一区二区三区四区| 国产欧美日韩中文字幕在线| 欧美日韩99| 亚洲乱亚洲乱妇| 日韩精品久久久毛片一区二区| 亚洲毛片在线播放| 色吧亚洲日本| 日本精品一区二区| 精品无人乱码| 你懂的网址国产 欧美| 久久久久毛片免费观看| 日本不卡一区二区三区| 可以免费看av的网址| 日韩一级黄色片| 欧美伊人久久大香线蕉综合69| www.色婷婷.com| 成人午夜在线观看视频| 午夜电影久久久| 欧美18一12sex性处hd| 夜夜精品浪潮av一区二区三区| 成人在线观看免费| ts人妖交友网站| 无码人妻精品一区二区蜜桃网站| 亚洲图片在区色| 五月婷婷丁香六月| 国产视频久久久| 女人高潮被爽到呻吟在线观看| 国产高潮视频在线观看| 任我爽精品视频在线播放| 啊啊啊射了视频网站| 国产av不卡一区二区| 色婷婷国产精品综合在线观看| 丰满少妇xbxb毛片日本| 99久久婷婷国产综合精品青牛牛| 国产精品综合久久久久久| 国产精品一区在线观看你懂的| 夜夜爽99久久国产综合精品女不卡| 国产精品呻吟| 国产午夜精品久久久久久免费视| 欧美xoxoxo| 免费网站在线观看黄| 小说区图片区图片区另类灬| 久久99精品视频一区97| 色女人在线视频| 欧洲av一区二区嗯嗯嗯啊| 亚洲在线色站| 黄网站app在线观看| 精品国产麻豆| 国产成人亚洲欧美电影| 欧美午夜免费电影| 国产午夜精品久久久久免费视| 亚洲第一天堂在线观看| 亚洲开发第一视频在线播放| swag国产精品一区二区| 日本在线丨区| 久久99性xxx老妇胖精品| www.天堂在线观看| 亚洲一区在线直播| 日本特黄特色aaa大片免费| 成人激情小说网站| www.久久网| 蜜臀av性久久久久蜜臀aⅴ| 国产情侣一区二区三区| 亚洲黄色成人| 午夜先锋成人动漫在线| 日韩亚洲国产中文字幕欧美| 欧美精品九九久久| 色久优优欧美色久优优| 中文字幕影片免费在线观看| 国产农村妇女毛片精品久久| 四虎av在线| 国产精品一区三区在线观看| h色视频在线观看| 国产福利91精品一区二区| 写真福利片hd在线观看| av电影在线免费观看| 国产精品亚洲综合一区在线观看| 欧美高清精品3d| 免费毛片在线看片免费丝瓜视频| 欧美欧美欧美欧美首页| 国产成人精品日本亚洲专区61| www.中文字幕在线观看| 欧美一卡二卡在线| 羞羞的视频在线观看| 777久久久精品一区二区三区| 一区二区三国产精华液| 青青草原亚洲| 91精品免费看| 国产精品免费视频一区一| xfplay精品久久| 乱人伦xxxx国语对白| 国产精品亚洲第一| 亚洲一二三四2021不卡| 久久99精品国产麻豆婷婷洗澡| 国产欧美一区二区三区网站| 动漫av网站免费观看| 国产一精品一av一免费爽爽| 永久免费av网站| 国产一线二线三线女| 2018中文字幕在线| 91美女福利视频| 国产精品日韩精品欧美精品| 麻豆自创视频在线观看| 在线中文字幕观看| 欧美激情视频一区| 99久久免费精品国产免费| 国产一区二区三区免费视频| 国产一区二区精品久久| 成人精品视频一区二区| 一级成人黄色片| 中文字幕日韩精品在线| 国产乱人伦丫前精品视频|