目录[-]

系统: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';