MySQL单表数据量超1亿,根据 索引列 批量删除数据
生活随笔
收集整理的這篇文章主要介紹了
MySQL单表数据量超1亿,根据 索引列 批量删除数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我的場景:MySQL8有個表數據量超1億,然后我要根據某個例(一對多)刪除數據,
我直接用:delete from 表 where 字段 in (select 其他表)? ? ?條件用in的方式執行報錯
[Err] 1206 - The total number of locks exceeds the lock table size
因為一次性要刪除數據量太多了,每個都加了行鎖,所以報錯了,而且這樣效率也不高,不穩定。
所以寫了個存儲過程的方式來刪除數據:
概述:
1.先查出刪除條件 in 的范圍值
2.將in值存儲到游標,然后一個一個循環
3.根據循環值 刪除表數據(一對多,索引列)
?
這樣不是一次性刪除,不用擔心mysql表行鎖的問題,運行也穩定不會出錯,效率也是最高的
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),放到游標里DECLARE COILNO_CURSOR CURSOR FORSELECT DELIVERYCOILNO FROM qualitydb.t_sg_mat_info WHERE STARTTIME BETWEEN '2021-01-01' AND '2021-07-01';-- 設置循環的次數(游標的大小)DECLARE EXIT HANDLER FOR NOT FOUND SET COILNO_CURSOR_COUNT = 0;OPEN COILNO_CURSOR;-- 循環游標WHILE COILNO_CURSOR_COUNT <> 0 DOFETCH COILNO_CURSOR INTO COILNO;-- INSERT INTO qualitydb.test(val2) VALUES(COILNO);-- 刪除表數據,我這里有兩個表要刪除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總結
以上是生活随笔為你收集整理的MySQL单表数据量超1亿,根据 索引列 批量删除数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php判断星期几switch,php 中
- 下一篇: MySQL员工部门查询