大資料中的批量刪除
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,相差不算太大。