MySQL刪除大量數據總結


有時候,數據多了就有煩惱了。將庫內相關表數據移除(存入其他庫內)可能是定期需要做的必要工作。

基本步驟如下:

1.導出預定的表內數據

2.導入到指定庫內

3.移除原庫的表內數據

很簡單吧。我們一步一步來實現。

1.導出預定的表內數據

一般來說,大部分表不會將數據全部導出,會保留符合條件的數據。一般,以時間條件較為常見。比如:要求保留2個月內的數據。

我們使用mysqldump這個工具就可以實現導出指定表並滿足指定邏輯條件。下面是一個例子:

mysqldump -uroot -p testdb  testtable --where="id<=125443450" > testtable201901.sql

上面這個命令是導出testdb庫內testtable表內id小於等於125443450的全部數據。

這個命令將包括創建表testtable以及插入數據到testtable表的命令。

如果有多個表需要導出,就參考上面的命令,多寫幾條就可以了。

這里要注意一下,使用時間作為保留數據的要求是較常見的。不過直接使用時間作為條件(特別是datetime類型的)可能會出現多導或少導幾條數據的情況(實測的結果,mysql 5.6,其他版本未檢測)。因此,建議先使用時間條件顯示出部分數據10-20條即可,然后確認最后一條數據,並取其id(自增長字段)作為導數據條件進行操作。

2.導入到指定庫內

這個實現更簡單,使用mysql工具可以簡單實現。下面是一個例子:

mysql -uroot -p testdbbak < testtable201901.sql

有多個表文件可以參考上面的命令。

3.移除原庫的表內數據

前兩步都非常簡單的實現了。

這步按說也很簡單,不過冒冒失失的實際操作起來可能會讓你瘋掉。

移除表數據的方法mysq命令中有2個,delete和truncate table

truncate table清除表內全部數據的命令。

特點是速度快。如果數據確認全部不要,用這個是最好的。

如果是部分刪除,那么truncate table就不適合了。

在刪除數據較少的情況,delete沒什么不好。

如果比較多,比如500萬條數據,那么你將可能面臨的問題如下:

a.執行時間較長

b.索引效率變低

c.磁盤空間未釋放

我遇到過執行delete時間超過40分鍾的情況....

在出現bc情況后,通常需要對表進行優化處理,這又是一次漫長的執行過程...

鑒於上面描述的問題,如果是刪除較多數據的時候,建議不使用delete的方式實現。

這里給出的一個建議方案如下,供大家參考:

使用mysqldump將表內需要保留的數據導出,之后立即將導出的數據恢復到原表內。

mysqldump -uroot -p chickens  testdb testtable --where="id>125443450" > testtable201901.sql
mysql  -uroot -p testdb< testtable201901.sql

為什么這個方案比直接使用delete好?

首先導出再導入,本質是將原表刪除了然后重建並重新插入數據。其避免了delete對表索引導致的問題,也就不需要之后在進行優化。也就是bc問題不存在了。

那么執行時間與delete比那個更少?這個不能簡單回答,雖然本人測試結果是delete時間更長。

這個主要取決於要刪除的數據和要保留的數據的多少。這里暫時無法給出精確的數據,不過兩者差不多的情況下,delete會更長。

至於為什么,有興趣的朋友可以自行研究下。

還其他問題需要進一步討論,時間限制稍后待續。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM