这一直困扰着我,为什么这个查询
SELECT
*
FROM
`TABLE`
WHERE `value` IN
(SELECT
val
FROM
OTHER_TABLE
WHERE `date` < '2014-01-01')
运行速度比顺序运行此查询慢几个数量级
SELECT
`val`
FROM
OTHER_TABLE
WHERE `date` < '2014-01-01'
Result:
+----+
| val |
+-----+
| v1 |
| v2 |
| v3 |
| v7 |
| v12 |
+-----+
和这个查询:
SELECT
*
FROM
`TABLE`
WHERE `value` IN ('v1', 'v2', 'v3', 'v7', 'v12')
来自文档:(重点是我添加的)
子查询优化IN
不如=
操作员
或对于IN(value_list)
操作员。
典型贫困案例IN
子查询的性能是当子查询
返回少量行,但外部查询返回大量行
要与子查询结果进行比较的行数。
问题是,对于使用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);
如果内部和外部查询分别返回 M 和 N 行,则
执行时间变为O(M×N)
, 而不是O(M+N)
作为
它将用于不相关的子查询。
一个含义是IN
子查询可能比查询慢得多
使用一个写成IN(value_list)
列出相同值的运算符
子查询将返回。
http://dev.mysql.com/doc/refman/5.7/en/subquery-restrictions.html http://dev.mysql.com/doc/refman/5.7/en/subquery-restrictions.html
希望这可以帮助其他可能好奇的人
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)