大廠面試題:如何快速從千萬級別的mysql表刪除部分資料

我們可能會經常遇到這種場景,一線的客戶向業務投訴,說自己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;

結果如下:

大廠面試題:如何快速從千萬級別的mysql表刪除部分資料

2、將第一步中的結果行(就是那些delete SQL語句)複製到一個空的SQL檔案中

3、通知DBA在使用者不活躍的時段執行上面的SQL,比如晚上11點以後,你會發現執行上面的SQL速度飛快,而且關鍵還不鎖表。