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

大資料中的批量刪除

oken表中目前有400w條資料,且以每天十幾萬的資料繼續增長。需要定期將其中過期的資料取消掉,僅保留最新的萬計以內的資料;

token表有兩個欄位:id(long ,自增),update_time(timestamp,更新時間),其中在id上建立了索引;

一次性刪除掉400w條資料顯然不靠譜,會發現刪除失敗,因為lock wait timeout exceed錯誤;

因此最後分批刪除,每次刪除1w條,分多次刪除;

此處有兩種方法可以實現:

第一種,在分批批量刪除中可以使用如下的limit方法:

delete from token where id > 0 order by id asc limit 10000;

第二種,取出最小的id和最大的id,每次自最小的id開始,每次增加10000,進行刪除;

delete from token where id <maxId;

以上的兩種方法其實都可以,可能會對第一種的limit的使用有疑問。

limit 有兩個引數,offset length。對於資料量大的時候,limit的效能急劇下降;

舉一個例子,如果一個表person有如下欄位id(long ,auto-increase,primary key),name(varchar),age(int),表中有1000w資料;

如下的語句肯定不行:select * from person where id > 10  limit 100000,100;

此處,mysql首先會掃描100010條資料,然後取出最後的10條資料返回,故效能很差;

但是可以變通為 select * from person where id in (select id from person where id >10 limit 100000,10 ),此處子查詢中使用了id的索引,可以大大降低查詢時間;

同樣對於上面的批量刪除中,id為主鍵,採用limit批量刪除是沒有問題的。

進行測試,刪除100w條資料,第一種方法用時3.227s,第二種用時3.524s,相差不算太大。