大資料中的批量刪除

2021-07-29 13:39:28 字數 990 閱讀 6975

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 以上的兩種方法其實都可以,可能會對第一種的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,相差不算太大。

Extjs中批量刪除grid中資料

第一種 這是刪除選中的行的 在js頁面 定義修改後的json物件 var jsonarray 獲取選中的行 var storedata ext.getcmp contracttest page grid getselectionmodel getselections 選中行不為空 if stored...

批量刪除memcache中資料的幾個方案

memcache的使用過程中,最常遇到的麻煩之一就是無法批量刪除memcache裡的資料,而這又是實際中很需要的操作,以下總結了了幾個方案 flush all 全部清掉 比較暴力 程式遍歷所有可能的key,刪除之修改應用程式中的key的生成規則 缺點是需要修改應用程式或配置檔案,在一些大型應用中是不...

JdbcTemplate資料批量刪除

由於資料的批量處理 比如往rdbms插入幾萬條資料 非常耗資源,因此建議在所有場合能夠借助於jdbc完成,而不要去採用hibernate api。本文主要圍繞spring內建的各類jdbc api抽象支援展開的。1.1.jdbctemplate內建的batchupdate final string ...