例如,如果我写
SELECT (subquery) FROM table WHERE (subquery)(subquery)是否会在每行执行一次以上?
我在SELECT中给它起了别名,并在WHERE中使用它,但这似乎是无效的。
发布于 2015-04-08 05:59:11
让我们看一下演示此用例的一个非常简单的查询的EXPLAIN PLAN。
EXPLAIN
SELECT (SELECT 1 FROM YOURTABLE LIMIT 1)
FROM DUAL
WHERE (SELECT 1 FROM YOURTABLE LIMIT 1);忽略LIMIT 1,它们只是为了避免在我的测试表上出现多行错误。
结果集将是
'1', 'PRIMARY', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'No tables used'
'3', 'SUBQUERY', 'YOURTABLE', 'index', NULL, 'PRIMARY', '4', NULL, '6', 'Using index'
'2', 'SUBQUERY', 'YOURTABLE', 'index', NULL, 'PRIMARY', '4', NULL, '6', 'Using index'如你所见,是的,子查询将被执行两次。
如果要在多个位置使用子查询的值,则可以考虑使用JOIN。
发布于 2015-04-08 06:11:40
一般来说,答案是肯定的。尽管查询优化器有权消除这些通用子表达式,但查询优化器很少这样做。
如果将子查询放在from子句中,它应该只执行一次:
SELECT s.value
FROM table cross join
(subquery) s
WHERE s.value或者,如果使用子查询:
SELECT value
FROM (SELECT (subquery) as value
FROM table
) s
WHERE value <> 0;在MySQL中,后一种结构增加了实现子查询的成本。因此,有另一个MySQL扩展可能会使这一点更有效:
SELECT (subquery) as value
FROM table
HAVING value <> 0;https://stackoverflow.com/questions/29502012
复制相似问题