MySQL:子句的顺序

4
MySQL 查询条件的顺序会影响查询效率吗?例如:
SELECT * 
  FROM TABLE AS t
 WHERE t.Employee_id = 1
   AND t.payout > 500

VS.

SELECT * 
  FROM TABLE AS t
 WHERE t.payout > 500
   AND t.Employee_id = 1

此外,如果 t.Employee_id 被索引,而 t.payout 没有被索引会怎样呢?
3个回答

1
MySQL查询子句的顺序会影响效率吗?
不会。
最接近的情况是在一个覆盖索引(一个单一索引有多个列)中列的顺序,根据左到右在索引声明中的列。在查询内使用列并不重要,关键在于覆盖索引中的最左列是否存在于查询中以触发使用。
如果对t.Employee_id建立索引而没有对t.payout建立索引怎么办?
优化器可能会决定使用该索引 - 拥有索引并不保证它会被使用。表统计数据也会影响是否使用索引的决策。
但是WHERE子句中列的顺序并不确定是否使用索引。

1

SQL中的所有顺序都可能被查询规划器重新排序,如果算术允许的话。这包括AND、OR、内连接、某些外连接等。它还可以重新组织IN语句、展开子查询等。

所以,是的,它会找到你正确的索引等。

但也要注意不要让它在你面前爆炸。例如,这个语句:

 select y <> 0 and (x / y) > 0;

在C语言中,这样的问题永远不会成为一个问题,但在SQL中,查询优化器完全可以先计算右侧并因除以零而出错。

如果您想强制执行顺序,您需要使用case语句:

 select case when y <> 0 then (x / y) > 0 else false end;

最后一点提示:对于包含大量连接和子查询的查询,规划器通常会遇到阈值,超出该阈值后它们不再尝试每个可能的计划,并使用遗传算法达到足够好的查询。当他们这样做时,连接顺序等确实很重要。

0
  1. 使用EXPLAIN运行查询,亲自查看。这总是最好的选择。
  2. 不用担心,MySQL的优化器会为您检查并给出它能想到的最佳结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接