某天,在生產環節中,發現一個定時任務表,由於每次服務區查詢這個表就會造成慢查詢,給mysql服務器帶來不少壓力,經過分析,該表中絕對部分數據是垃圾數據
需要刪除,約1050萬行,由於缺乏處理大數據的額經驗,開始直接使用delete搭配where條件進行清理,最后執行了1個小時也沒有完成,后來經過跟查詢,1000萬條數據
的刪除需要幾十個小時甚至上百小時,果斷放棄,采用了迂回策略。
三步驟策略:
1、抽取需要保留的數據到備份表中
2、truncate舊表
3、備份的數據插入回來
通過以上思路果斷在10分鍾內解決了,收獲就是千萬級數據刪除delete是不可取的。
補充注詳細步驟:
0、建立備份表 CREATE TABLE 新表 SELECT * FROM 舊表 WHERE 1=2;
1、提取舊表需要保留的數據 INSERT INTO 新表 SELECT * FROM 舊表 WHERE 查詢條件;
2、禁用外鍵為初始化舊表做准備SET foreign_key_checks = 0;(如果舊表中有外鍵,最好禁用下,否則truncate會提示,)
3、初始化舊表 TRUNCATE TABLE 舊表;
4、提取出來的數據恢復到舊表INSERT INTO 舊表 SELECT * FROM 新表;
5、開啟外鍵SET foreign_key_checks = 1;
1、提取舊表需要保留的數據 INSERT INTO 新表 SELECT * FROM 舊表 WHERE 查詢條件;
2、禁用外鍵為初始化舊表做准備SET foreign_key_checks = 0;(如果舊表中有外鍵,最好禁用下,否則truncate會提示,)
3、初始化舊表 TRUNCATE TABLE 舊表;
4、提取出來的數據恢復到舊表INSERT INTO 舊表 SELECT * FROM 新表;
5、開啟外鍵SET foreign_key_checks = 1;
其他注意事項:
1、操作大數據的過程中最好關閉mysql的日期記錄和慢日志查詢。