我对数据库很马虎,无法通过连接来实现这一点,而且我什至不确定那样会更快...
DELETE FROM atable
WHERE btable_id IN (SELECT id
FROM btable
WHERE param > 2)
AND ctable_id IN (SELECT id
FROM ctable
WHERE ( someblob LIKE '%_ID1_%'
OR someblob LIKE '%_ID2_%' ))
Atable 包含约 19M 行,这将删除其中的约 3M。目前,我只能使用 LIMIT 100000
运行查询,而且我不想整天坐在这里使用 phpmyadmin,因为每次删除(100.000 行)运行大约 1.5 分钟。
有什么方法可以加速/自动化它?
MySQL 5.5
(如果任何表包含 2000 万行,你认为它已经是糟糕的数据库设计了吗?)
最佳答案
使用EXISTS
或JOIN
而不是IN
来提高性能
使用 EXISTS:
DELETE FROM Atable A
WHERE EXISTS (SELECT 1 FROM Btable B WHERE A.Btable_id = B.id AND B.param > 2) AND
EXISTS (SELECT 1 FROM Ctable C WHERE A.Ctable_id = C.id AND (C.someblob LIKE '%_ID1_%' OR C.someblob LIKE '%_ID2_%'))
使用 JOIN:
DELETE A
FROM Atable A
INNER JOIN Btable B ON A.Btable_id = B.id AND B.param > 2
INNER JOIN Ctable C WHERE A.Ctable_id = C.id AND (C.someblob LIKE '%_ID1_%' OR C.someblob LIKE '%_ID2_%')
关于mysql - 如何优化这个数据库操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994852/