引言
小A正在balabala寫代碼呢,DBA小B突然發(fā)來了一條消息,“快看看你的用戶特定信息表T,里面的主鍵,也就是自增id,都到16億了,這才多久,在這樣下去過不了多久主鍵就要超出范圍了,插入就會失敗,balabala......”
我記得沒有這么多,最多1k多萬,count了下,果然是1100萬。原來運(yùn)維是通過auto_increment那個值看的,就是說,表中有大量的刪除插入操作,但是我大部分情況都是更新的,怎么會這樣?
下面話不多說了,來一起看看詳細(xì)的介紹吧
問題排查
這張表是一個簡單的接口服務(wù)在使用,每天大數(shù)據(jù)會統(tǒng)計(jì)一大批信息,然后推送給小A,小A將信息更新到數(shù)據(jù)庫中,如果是新數(shù)據(jù)就插入,舊數(shù)據(jù)就更新之前的數(shù)據(jù),對外接口就只有查詢了。
很快,小A就排查了一遍自己的代碼,沒有刪除的地方,也沒有主動插入、更新id的地方,怎么會這樣呢?難道是小B的原因,也不太可能,DBA那邊兒管理很多表,有問題的話早爆出來了,但問題在我這里哪里也沒頭緒。
小A又仔細(xì)觀察了這1000多萬已有的數(shù)據(jù),將插入時(shí)間、id作為主要觀察字段,很快,發(fā)現(xiàn)了個問題,每天第一條插入的數(shù)據(jù)總是比前一天多1000多萬,有時(shí)候遞增的多,有時(shí)候遞增的少,小A又將矛頭指向了DBA小B,將問題又給小B描述了一遍。
小B問了小A,“你是是不是用了REPLACE INTO ...語句”,這是怎么回事呢,原來REPLACE INTO ...會對主鍵有影響。
REPLACE INTO ...對主鍵的影響
假設(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='測試replace into'; |
如果新建這張表,執(zhí)行下面的語句,最后的數(shù)據(jù)記錄如何呢?
| insert into t1 values(NULL, 100, "test1"),(NULL, 101, "test2");replace into t1 values(NULL, 100, "test3"); |

原來,REPLACE INTO ...每次插入的時(shí)候如果唯一索引對應(yīng)的數(shù)據(jù)已經(jīng)存在,會刪除原數(shù)據(jù),然后重新插入新的數(shù)據(jù),這也就導(dǎo)致id會增大,但實(shí)際預(yù)期可能是更新那條數(shù)據(jù)。
小A說:“我知道replace是這樣,所有既沒有用它”,但還是又排查了一遍,確實(shí)不是自己的問題,沒有使用REPLACE INTO ...,
小A又雙叒叕仔細(xì)的排查了一遍,還是沒發(fā)現(xiàn)問題,就讓小B查下binlog日志,看看是不是有什么奇怪的地方,查了之后還是沒發(fā)現(xiàn)問題,確實(shí)存在跳躍的情況,但并沒有實(shí)質(zhì)性的問題。
新聞熱點(diǎn)
疑難解答
圖片精選