gpt4 book ai didi

mysql - MySql 上的 DELETE 查询速度慢

转载 作者:行者123 更新时间:2023-11-29 12:51:00 25 4
gpt4 key购买 nike

我有一个 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 比较陌生,所以我不知道如何解决这个问题。在线搜索对我没有多大帮助,因此我希望这里有人可以向我展示分析此查询的方法/找出导致它花费这么长时间的原因。

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

最佳答案

当包含许多项时,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

关于mysql - MySql 上的 DELETE 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24721709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com