mysql大量刪除資料sql語句詳解

來源:互聯網
上載者:User

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這樣的語句來完成
 

 代碼如下 複製代碼
DELETE FROM syslogs WHERE status=1 ORDER BY statusid LIMIT 10000;

然後分多次執行就可以把這些記錄成功刪除。

另一種 刪除方向。

上面通過比較覺的需要刪除的量不是太大時,把需要刪除的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執行速度應該不會太慢了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.