gpt4 book ai didi

mysql - 为什么mysql会判定这个子查询是依赖的呢?

转载 作者:可可西里 更新时间:2023-11-01 07:47:45 26 4
gpt4 key购买 nike

在 MySQL 5.1.34 服务器上,我遇到以下令人困惑的情况:

mysql> explain select * FROM master.ObjectValue WHERE id IN ( SELECT id FROM backup.ObjectValue ) AND timestamp < '2008-04-26 11:21:59';
+----+--------------------+-------------+-----------------+-------------------------------------------------------------+------------------------------------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------------+-----------------+-------------------------------------------------------------+------------------------------------+---------+------+--------+-------------+
| 1 | PRIMARY | ObjectValue | range | IX_ObjectValue_Timestamp,IX_ObjectValue_Timestamp_EventName | IX_ObjectValue_Timestamp_EventName | 9 | NULL | 541944 | Using where |
| 2 | DEPENDENT SUBQUERY | ObjectValue | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using index |
+----+--------------------+-------------+-----------------+-------------------------------------------------------------+------------------------------------+---------+------+--------+-------------+
2 rows in set (0.00 sec)

mysql> select * FROM master.ObjectValue WHERE id IN ( SELECT id FROM backup.ObjectValue ) AND timestamp < '2008-04-26 11:21:59';
Empty set (2 min 48.79 sec)

mysql> select count(*) FROM master.ObjectValue;
+----------+
| count(*) |
+----------+
| 35928440 |
+----------+
1 row in set (2 min 18.96 sec)
  • 为什么只检查 500000 条记录需要 3 分钟?访问所有记录需要2分钟?
  • 子查询如何单独的数据库被归类为依赖?
  • 我能做些什么来加快速度这个查询?

更新:

实际花费很长时间的查询是 DELETE,但您无法对这些进行解释; DELETE 是我使用子选择的原因。我现在已经阅读了文档并发现了语法“DELETE FROM t USING ...”重写查询来自:

DELETE FROM master.ObjectValue 
WHERE timestamp < '2008-06-26 11:21:59'
AND id IN ( SELECT id FROM backup.ObjectValue ) ;

进入:

DELETE FROM m 
USING master.ObjectValue m INNER JOIN backup.ObjectValue b ON m.id = b.id
WHERE m.timestamp < '2008-04-26 11:21:59';

空 backup.ObjectValue 的时间从几分钟减少到 0.01 秒。

谢谢大家的好建议。

最佳答案

依赖子查询会使您的外部查询减慢到爬行(我想您知道这意味着它在正在查看的数据集中找到的每行运行一次)。

那里不需要子查询,不使用子查询会显着加快查询速度:

SELECT m.*
FROM master.ObjectValue m
JOIN backup.ObjectValue USING (id)
WHERE m.timestamp < '2008-06-26 11:21:59'

MySQL 经常将子查询视为依赖项,即使它们不是。我从来没有真正理解其中的确切原因 - 也许只是因为查询优化器无法将其识别为独立的。我从不费心查看更多细节,因为在这些情况下,您几乎总是可以将其移至 FROM 子句,从而修复它。

例如:

DELETE FROM m WHERE m.rid IN (SELECT id FROM r WHERE r.xid = 10)
// vs
DELETE m FROM m WHERE m.rid IN (SELECT id FROM r WHERE r.xid = 10)

前者会产生一个依赖子查询并且可能非常慢。后者将告诉优化器隔 ionic 查询,这避免了表扫描并使查询运行得更快。

关于mysql - 为什么mysql会判定这个子查询是依赖的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330856/

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