1.like与 in批量删除指定记录
like语法
like主要是用来模糊查询了
sql = "delete from A where field like '%ABC%'" 这个可用于字符与数字
in 语法
sql = "delete from A where field id(1,2,3)" 这个只能用在数字
关联删除
delete B from B
where exists (select 1 from A where B.accountid=A.accountid);
上面两条方法如果删除100W级别的数据库估计是没什么问题,如果是1000W估计就不行了
假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行
DELETE FROM syslogs WHERE statusid=1
会发现删除失败,因为lock wait timeout exceed的错误。
因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数分批删除,比如每10000条进行一次删除,那么我们可以利用 MySQL这样的语句来完成
代码如下
DELETE FROM syslogs WHERE status=1 ORDER BY statusid LIMIT 10000;
然后分多次执行就可以把这些记录成功删除。
另一种 删除方向。
上面通过比较觉的需要删除的量不是太大时,把需要删除的PID生到到另一个临时表中。
代码如下
mysql DBname -e "select a.pid from table1 a ,table2 b where
a.pid=b.pid">del_pid.txt;
sed -i '1d' del_pid.txt
awk '{print "delete from table1 where pid=",$1,";"}' del_pid.txt >del_pid.sql
mysql DBname
这样把SQL拆成多个SQL执行速度应该不会太慢了。