我有一个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比较陌生,所以我不知道如何解决这个问题。在线搜索对我来说没有多大帮助,所以我希望有人能在这里向我展示这个查询的分析/弄清楚导致它花了这么长时间的原因。
如果需要更多信息来帮助解决此问题,请告知我们。
答案 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