上次留了點尾巴,花點時間再說下。
首先對上次的方案做個小結。
先備份表內部分資料,再直接恢復資料到表內。
在主要遇到的場景下,執行時間會少於直接delete,主要原因如下:
1.delete在執行中(刪除大量資料),多數是乙個或者多個範圍條件,索引無法給與優化。執行中需要掃瞄索引和表內資料,最後還需要寫入binlog,這對資源的消耗是非常大的。
2.本文方案在執行中,備份中使用了where,可以通過巧妙的sql語法,充分利用索引。在之後的恢復過程中,drop table和create table執行時間忽略不計,主要是insert對資源消耗大。但是insert操作跟delete相比消耗資源又是相對較小的。備份下來的insert語句都是一次寫入多行,效率較高。
綜上所述,本文的方案多數情況好於直接delete。另外對於索引的優化維護上,本文方案中實際上重建了索引,已經處於最優狀態,無需後續在執行優化。
最後再說補充乙個種情況。
有時候,匯出的資料需要追加到指定的資料庫內。而之前可能已經有一部分資料存在裡面。
如果直接使用本文方案,那麼會drop之前存的資料,造成資料損失。
在確認資料必須儲存同時必須存放在同乙個庫內同乙個表內的情況後,將匯出資料語句稍作修改就可以了。
mysqldump -uroot -p-tchickens testdb testtable --where="id>125443450" > testtable201901.sql
mysql -uroot -p testdb< testtable201901.sql
在mysqldump是用了「-t」引數,不做表結構匯出。這樣會得到一堆insert語句,之後直接匯入指定庫即可。
mysql大量資料刪除
近期有一張表,存量有3000多萬資料,每天還在以40萬左右增長。業務上準備只保留兩個月的資料。準備刪除。這個量直接刪除,可能會導致鎖表。要麼寫個儲存過程,迴圈,每次刪除1000條,sleep下。當然這個方法很不錯。但delete是dml語言,刪除只是把狀態標記為刪除,並沒有刪除資料檔案,也就是空間索...
mysql刪除大量資料
mysql刪除大量資料時使用批量刪除,批量刪除時,不要使用排序,會影響刪除效率 delete from table name where id 66169770 limit 1000000 以下資料摘自 生產環境,往往需要更新 刪除大量的資料,由於很可能消耗太多的io資源,對於生產繁忙的系統,需要小...
MySql刪除大量資料
再介紹刪除解決方案前,先來回顧下三種刪除表的操作 delete語句 truncate語句以及drop語句。drop truncate delete 下面說下刪除大量資料的解決方案 delete from t test limit 100000或者建立儲存過程 delimiter drop proce...