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不被索引怎么办?
答案 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)
EXPLAIN
调查查询以便自行查看。永远是最好的选择