Mysql 如果在SELECT和WHERE子句中同时使用子查询,它是否执行多次?

Mysql 如果在SELECT和WHERE子句中同时使用子查询,它是否执行多次?,mysql,Mysql,e、 g.如果我写信 SELECT (subquery) FROM table WHERE (subquery) 子查询是否每行执行一次以上 我会在“选择”中使用它,在“位置”中使用它,但这似乎是无效的。让我们看看一个非常简单的查询的解释计划,它演示了这个用例 EXPLAIN SELECT (SELECT 1 FROM YOURTABLE LIMIT 1) FROM DUAL WHERE (SELECT 1 FROM YOURTABLE LIMIT 1); 忽略限制1,它们只是为了

e、 g.如果我写信

SELECT (subquery) FROM table WHERE (subquery)
子查询是否每行执行一次以上

我会在“选择”中使用它,在“位置”中使用它,但这似乎是无效的。

让我们看看一个非常简单的查询的解释计划,它演示了这个用例

EXPLAIN 
SELECT (SELECT 1 FROM YOURTABLE LIMIT 1) 
 FROM DUAL 
 WHERE (SELECT 1 FROM YOURTABLE LIMIT 1);
忽略限制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来代替。

一般来说,答案是肯定的。尽管查询优化器有权消除这种常见的子表达式,但查询优化器很少这样做

如果将子查询放在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;
我不想用拥有。这是一个简单的解决方案,可以将我的查询速度提高20%左右。谢谢联接的问题是,您不能引用子查询中的任何其他表,必须将它们移到外部的ON,而ON会变得非常难看。