MySQL单表数据量超1亿,根据 索引列 批量删除数据
生活随笔
收集整理的這篇文章主要介紹了
MySQL单表数据量超1亿,根据 索引列 批量删除数据
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我的場(chǎng)景:MySQL8有個(gè)表數(shù)據(jù)量超1億,然后我要根據(jù)某個(gè)例(一對(duì)多)刪除數(shù)據(jù),
我直接用:delete from 表 where 字段 in (select 其他表)? ? ?條件用in的方式執(zhí)行報(bào)錯(cuò)
[Err] 1206 - The total number of locks exceeds the lock table size
因?yàn)橐淮涡砸獎(jiǎng)h除數(shù)據(jù)量太多了,每個(gè)都加了行鎖,所以報(bào)錯(cuò)了,而且這樣效率也不高,不穩(wěn)定。
所以寫了個(gè)存儲(chǔ)過程的方式來刪除數(shù)據(jù):
概述:
1.先查出刪除條件 in 的范圍值
2.將in值存儲(chǔ)到游標(biāo),然后一個(gè)一個(gè)循環(huán)
3.根據(jù)循環(huán)值 刪除表數(shù)據(jù)(一對(duì)多,索引列)
?
這樣不是一次性刪除,不用擔(dān)心mysql表行鎖的問題,運(yùn)行也穩(wěn)定不會(huì)出錯(cuò),效率也是最高的
CREATE DEFINER=`root`@`%` PROCEDURE `clean_old_defectData`() BEGIN#Routine body goes here...DECLARE COILNO VARCHAR(255);DECLARE COILNO_CURSOR_COUNT INT DEFAULT 1;-- 先查出刪除條件 in 里面的值(我的是DELIVERYCOILNO),放到游標(biāo)里DECLARE COILNO_CURSOR CURSOR FORSELECT DELIVERYCOILNO FROM qualitydb.t_sg_mat_info WHERE STARTTIME BETWEEN '2021-01-01' AND '2021-07-01';-- 設(shè)置循環(huán)的次數(shù)(游標(biāo)的大小)DECLARE EXIT HANDLER FOR NOT FOUND SET COILNO_CURSOR_COUNT = 0;OPEN COILNO_CURSOR;-- 循環(huán)游標(biāo)WHILE COILNO_CURSOR_COUNT <> 0 DOFETCH COILNO_CURSOR INTO COILNO;-- INSERT INTO qualitydb.test(val2) VALUES(COILNO);-- 刪除表數(shù)據(jù),我這里有兩個(gè)表要?jiǎng)h除DELETE FROM qualitydb.t_sg_defect_info WHERE DELIVERYCOILNO = COILNO;DELETE FROM qualitydb.t_sg_defect_quality_result WHERE coil_id = COILNO;END WHILE;CLOSE COILNO_CURSOR; END總結(jié)
以上是生活随笔為你收集整理的MySQL单表数据量超1亿,根据 索引列 批量删除数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php判断星期几switch,php 中
- 下一篇: GIT SSH配置已有秘钥