1.like與 in批量刪除指定記錄
like語法
like主要是用來模糊查詢了
sql = "delete from A where field like '%ABC%'" 這個可用於字符與數字
in 語法
sql = "delete from A where field id(1,2,3)" 這個只能用在數字
關聯刪除
delete B from B
where exists (select 1 from A where B.accountid=A.accountid);
上面兩條方法如果刪除100W級別的數據庫估計是沒什麼問題,如果是1000W估計就不行了
假設有一個表(syslogs)有1000萬條記錄,需要在業務不停止的情況下刪除其中statusid=1的所有記錄,差不多有600萬條, 直接執行 DELETE FROM syslogs WHERE statusid=1
會發現刪除失敗,因為lock wait timeout exceed的錯誤。
因為這條語句所涉及的記錄數太多,因此我們通過LIMIT參數分批刪除,比如每10000條進行一次刪除,那麼我們可以利用 MySQL這樣的語句來完成
然後分多次執行就可以把這些記錄成功刪除。
另一種 刪除方向。
上面通過比較覺的需要刪除的量不是太大時,把需要刪除的PID生到到另一個臨時表中。
代碼如下 復制代碼mysql DBname -e "select a.pid from table1 a ,table2 b where a.pid=b.pid">del_pid.txt;
sed -i '1d' del_pid.txt
awk '{print "delete from table1 where pid=",$1,";"}' del_pid.txt >del_pid.sql
mysql DBname<del_pid.sql
這樣把SQL拆成多個SQL執行速度應該不會太慢了。