目录[-]
系统:Ubuntu Server 16.04
MySQL 5.7.20
常用where结合in和order by删除数据,如果删除数据条数较多,万条甚至百万条,可使用limit命令,避免长时间锁表操作,影响正常业务运行。
一、两种高性能方法
1、WHERE ... IN
DELETE FROM AlertData WHERE SendTime IN (' 2018-04-05 06:07:08','2018-04-05 06:07:09');2、WHERE...ORDER BY
DELETE FROM AlertData WHERE SendTime < "2018-04-06 06:07:09" ORDER BY SendTime LIMIT 10000;
假如需要删除1000万条,可以使用limit命令分批删除,避免锁表,保证业务稳定性。
测试情况:
阿里云ECS 1 核 2G 内存,
自搭MySQL服务器,
一次删除1W条数据,只需要0.6S左右
二、遇到的问题
MySQL 5.7以上版本,由于sql_mode变化,会导致出现以下错误提示:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决办法:
1、查看sql_mode
select @@global.sql_mode
查询出来的值为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2、去掉ONLY_FULL_GROUP_BY,重新设置值
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
