MySQL:子句的顺序

时间:2011-05-15 07:31:14

标签: mysql sql

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 个答案:

答案 0 :(得分:1)

  

MySQL查询子句的顺序是否会影响效率?

没有

根据索引声明中从左到右的列,您获得的最接近的是覆盖索引中的列顺序(多个列,对于单个索引)。在查询中使用列的位置无关紧要,因为查询中存在覆盖索引中最左侧的列以触发使用。

  

如果t.Employee_id被编入索引,而t.payout不是?

优化器可能决定使用索引 - 有一个不保证它将被使用。表统计信息也会影响使用索引的决定。

但是WHERE子句中列的顺序并不确定是否使用了索引。

答案 1 :(得分:1)

如果算术允许的话,sql中所有内容的顺序都会被查询计划程序重新排序。这包括AND,OR,内部联接,外部联接的一些情况等。它还可以重新组织IN语句,不需要的子查询等。

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

小心不要让它在你的脸上爆炸。这句话,例如:

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

永远不会在C语言中出现问题,但在SQL中,计划程序完全可以自由地首先评估右侧并通过零错误阻塞除法。

如果您想强制执行订单,则需要使用案例陈述:

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

最后注意:对于充满连接和子查询的大量查询,规划人员通常会遇到阈值,超过这些阈值,他们不再尝试每个可能的计划,并使用遗传算法达到足够好的查询。当他们这样做时,连接顺序等确实很重要。

答案 2 :(得分:0)

  1. 使用EXPLAIN调查查询以便自行查看。永远是最好的选择
  2. 没关系,MySQL的优化器会为你检查它并给你最好的结果。