我們可能會經常遇到這種場景,一線的客戶向業務投訴,說自己app的資料不對,然後業務就找到開發同學,各種排查,最後發現是因為程式處理不當的原因導致了髒資料,那遇到這類情況怎麼辦呢?最常見的處理方式,就是透過sql指令碼去快速修復資料,然後再緊急透過熱釋出修復程式bug。
但是,我們如果遇到的是一張上千萬甚至上億級別的表出現了髒資料,如果sql沒寫好,很容易鎖表,這將對業務會產生很大的影響。
例如我們有一張使用者資訊表t_user, 這個表有id,user_no, user_name, user_grade, user_points等欄位,其中user_grade欄位是索引
場景一。 假如我們要從t_user 中刪除user_grade = 1的記錄,很多人可能這樣寫修復SQL,如下所示:
delete from t_user where user_grade = 1; (
不推薦,容易鎖表,
)
那有沒有更好的辦法呢?有,我們可以將上面的走user_grade索引,改為走id索引的刪除語句
步驟如下:
1、轉為select的delete語句
select CONCAT(‘delete from t_user where id=’, id, “”) as ‘刪除sql’ from t_user where user_grade = 1;
結果如下:
2、將第一步中的結果行(就是那些delete SQL語句)複製到一個空的SQL檔案中
3、通知DBA在使用者不活躍的時段執行上面的SQL,比如晚上11點以後,你會發現執行上面的SQL速度飛快,而且關鍵還不鎖表。