在MySql上删除查​​询速度慢

时间:2014-07-13 10:29:42

标签: mysql sql database

我有一个SQL查询,其目的是“修剪”表中出现小于2的项目。表格非常大,修剪的项目数量也很大(~21000行)

我正在运行的删除操作如下:

DELETE FROM Terms
WHERE TermID IN (
    SELECT TermID
    FROM TermOccurrences
    GROUP BY TermID
    HAVING SUM(Counter) <=2
);

查询速度很慢,我还没有看到它完整(我试图多次重新运行)。我还应该注意,我的CPU /磁盘监视器显示一个内核的CPU使用率很高,但磁盘上的I / O很少

如果我独立运行内部SELECT查询很快,所以我认为这不是瓶颈。这是内部查询的解释:

+----+-------------+-----------------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table           | type | possible_keys | key  | key_len | ref  | rows   | Extra                           |
+----+-------------+-----------------+------+---------------+------+---------+------+--------+---------------------------------+
|  1 | SIMPLE      | TermOccurrences | ALL  | NULL          | NULL | NULL    | NULL | 113135 | Using temporary; Using filesort |
+----+-------------+-----------------+------+---------------+------+---------+------+--------+---------------------------------+

我还应该注意,TermOccurrences表在Terms.TermID上有外键约束,它被设置为级联删除。

Terms表在TermID上有一个主键索引,TermOccurrences在两列(TermID,PageID)上有一个复合主键索引。

这些表都使用了InnoDB引擎(但我也尝试过没有区别的MyISAM)。

我对MySQL比较陌生,所以我不知道如何解决这个问题。在线搜索对我来说没有多大帮助,所以我希望有人能在这里向我展示这个查询的分析/弄清楚导致它花了这么长时间的原因。

如果需要更多信息来帮助解决此问题,请告知我们。

1 个答案:

答案 0 :(得分:1)

包含许多项时,IN()子句可能会很慢。请尝试使用JOIN

DELETE T1
FROM Terms t1
JOIN 
(
    SELECT TermID
    FROM TermOccurrences
    GROUP BY TermID
    HAVING SUM(Counter) <=2
) T2 on T1.TermID = T2.TermID