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,相差不算太大。