1. 程式人生 > >MySQL刪除大批量資料

MySQL刪除大批量資料

1.刪除大表的部分資料

一個表有1億6000萬的資料,有一個自增ID。最大值就是1億6000萬,需要刪除大於250萬以後的資料,有什麼辦法可以快速刪除?

看到mysql文件有一種解決方案:http://dev.mysql.com/doc/refman/5.0/en/delete.html

         If you are deleting many rows from a large table, you may exceed the lock table size for an InnoDB table. To avoid this problem, or simply to minimize the time that the table remains locked, the following strategy (which does not use DELETE at all) might be helpful:

        Select the rows not to be deleted into an empty table that has the same structure as the original table:
        INSERT INTO t_copy SELECT * FROM t WHERE ... ;



        Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
        RENAME TABLE t TO t_old, t_copy TO t;

        Drop the original table:
        DROP TABLE t_old;


刪除大表的多行資料時,會超出innod block table size的限制,最小化的減少鎖表的時間的方案是:
1、選擇不需要刪除的資料,並把它們存在一張相同結構的空表裡
2、重新命名原始表,並給新表命名為原始表的原始表名
3、刪掉原始表

原文:http://www.2cto.com/database/201211/170796.html

2、刪除帶索引的表

       在My SQL資料庫使用中,有的表儲存資料量比較大,達到每天三百萬條記錄左右,此表中建立了三個索引,這些索引都是必須的,其他程式要使用。由於要求此表中的資料只保留當天的資料,所以每當在凌晨的某一時刻當其他程式處理完其中的資料後要刪除該表中昨天以及以前的資料,使用delete刪除表中的上百萬條記錄時,MySQL刪除速度非常緩慢,每一萬條記錄需要大概4分鐘左右,這樣刪除所有無用資料要達到八個小時以上,這是難以接受的。
      

       查詢MySQL官方手冊得知刪除資料的速度和建立的索引數量是成正比的,於是刪除掉其中的兩個索引後測試,發現此時刪除速度相當快,一百萬條記錄在一分鐘多一些,可是這兩個索引其他模組在每天一次的資料整理中還要使用,於是想到了一個折中的辦法:

        在刪除資料之前刪除這兩個索引,此時需要三分鐘多一些,然後刪除其中無用資料,此過程需要不到兩分鐘,刪除完成後重新建立索引,因為此時資料庫中的資料相對較少,約三四十萬條記錄(此表中的資料每小時會增加約十萬條),建立索引也非常快,約十分鐘左右。這樣整個刪除過程只需要約15分鐘。對比之前的八個小時,大大節省了時間。