mysql - 如何优化这个数据库操作?

标签 mysql sql join sql-delete exists

我对数据库很马虎,无法通过连接来实现这一点,而且我什至不确定那样会更快...

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 万行,你认为它已经是糟糕的数据库设计了吗?)

最佳答案

使用EXISTSJOIN 而不是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/

相关文章:

mysql - CakePHP:如何计算查找中的 hasMany 记录数?

java - 更新以昵称为主键的表的行

c# - 替换引号是否足以防止 SQL 注入(inject)?

asp.net - Parameters 真的足以防止 Sql 注入(inject)吗?

mysql UPDATE 行包含来自另一个表的数据的最高值

linux - 为什么 unix utility join 在不同的 Linux 发行版上会产生不同的结果?

MySQL 2表到另一个表

mysql - 按多列排序,哪一列先排序?

mysql - 为什么在MySQL中添加新索引时,索引的基数没有变化?

php - 无法使用 PHP 表单编辑表中的数据