解释命令的 select_type 列中的 DEPENDENT UNION 是啥?
Posted
技术标签:
【中文标题】解释命令的 select_type 列中的 DEPENDENT UNION 是啥?【英文标题】:What is DEPENDENT UNION in select_type column from explain command?解释命令的 select_type 列中的 DEPENDENT UNION 是什么? 【发布时间】:2013-10-04 20:59:04 【问题描述】:来自 mysql ref manual:“UNION 中的第二个或以后的 SELECT 语句,取决于外部查询”。 但是 UNION 查询如何依赖于外部查询呢?有人可以给我一个明确的例子,这是什么意思?例如,在这个查询中:
SELECT * FROM sometable
WHERE id IN (
SELECT 1
UNION
SELECT 2 /* ! */
)
union 中的第二个 select 语句(它本身是子查询)有 DEPENDENT UNION select_type,我不知道为什么,它必须只是 UNION,因为它不依赖任何东西。
【问题讨论】:
【参考方案1】:好吧,这种情况下的问题是IN
运算符,因为IN
子句中的子查询被重写为相关子查询。
如果是联合,相关子查询将为您提供“依赖子查询”或“依赖联合”。
见doc
问题在于,对于使用 IN 子查询的语句, 优化器将其重写为相关子查询。考虑以下 使用不相关子查询的语句:
SELECT ... FROM t1 WHERE t1.a IN (SELECT b FROM t2);优化器 将语句重写为相关子查询:
SELECT ... FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.b = t1.a);
【讨论】:
但是在SELECT 1 UNION SELECT 2
查询第二个语句有UNION
类型,而不是DEPENDENT UNION
,为什么?
@kirugan 抱歉累了,我想我终于明白了。
Didnt know about
IN` 的行为,似乎是真的。谢谢!
@Raphaël Althaus 请看我的帖子,我不明白为什么我与联合的查询需要永远但没有联合却非常快,从你在两个查询中写的内容来看,它应该充当关联子查询,耗时较长dba.stackexchange.com/questions/133972/…以上是关于解释命令的 select_type 列中的 DEPENDENT UNION 是啥?的主要内容,如果未能解决你的问题,请参考以下文章
软件安全实验——pre7(JIT sprayheap spraySEH绕过DEP漏洞预习)