WHERE子句中的条件顺序是否会影响MySQL性能?

Gre*_*reg 43 mysql sql

假设我有一个冗长,昂贵的查询,包含条件,搜索大量行.我还有一个特殊的条件,比如公司ID,它将限制需要大量搜索的行数,将其缩小到数十万甚至几十万.

这样做对MySQL性能有什么影响:

 SELECT * FROM clients WHERE 
       (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND 
       (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND 
       company = :ugh
Run Code Online (Sandbox Code Playgroud)

或这个:

 SELECT * FROM clients WHERE 
       company = :ugh AND
       (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND 
       (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) 
Run Code Online (Sandbox Code Playgroud)

Ste*_*ers 24

这是一个在线演示,显示WHERE子句条件的顺序可能会因短路而产生影响:

http://rextester.com/HJGN96158

这将运行以下查询:

-- query #1
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;

-- query #2
SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
Run Code Online (Sandbox Code Playgroud)

它们之间的唯一区别是OR条件中操作数的顺序.

myslowfunction故意睡眠一秒,并且每次运行时都会在日志表中添加一个条目.以下是运行上述两个查询时记录的结果:

myslowfunction called for query #1 with value 1
myslowfunction called for query #1 with value 2
myslowfunction called for query #2 with value 1
myslowfunction called for query #2 with value 2
myslowfunction called for query #2 with value 3
myslowfunction called for query #2 with value 4
Run Code Online (Sandbox Code Playgroud)

上面显示当一个缓慢的函数出现在OR另一个操作数不总是为真的条件的左侧时,它会被执行多次.

所以IMO回答了这个问题:

WHERE子句中的条件顺序是否会影响MySQL性能?

是"有时可以做到".


Amb*_*ber 17

不,订单不应该有很大的不同.当找到哪些行匹配条件时,检查每一行的条件(通过布尔逻辑组合的所有子条件).

一些智能数据库引擎将尝试猜测可以更快地评估条件的哪些部分(例如,不使用内置函数的事物)并首先评估这些部分,并且稍后评估更复杂(估计)的元素.这是由数据库引擎决定的,而不是SQL.


wim*_*vds 5

你的where子句中列的顺序并不重要,因为MySQL会在执行之前优化查询.但我建议您阅读MySQL参考手册中的" 优化 "一章,以获得有关如何分析查询和表的基本概念,并在必要时对其进行优化.但就个人而言,我总是试图将索引字段放在非索引字段之前,并根据它们应返回的行数对它们进行排序(最先限制条件最多,最后限制最少).


Nee*_*asu 5

数学上是的它有效果。不仅在 SQL 查询中。而是在所有编程语言中,只要有and/表达式or。有一种完全评价或部分评价的理论。如果它的一个和查询和第一个表达式的and计算结果为假,它将不会进一步检查。as anding false 任何东西都会产生 false 。同样,在 or 表达式中,如果第一个为真,则不会进一步检查。

  • 它们不是唯一的选择。有些语言有短路求值。有些承诺评估所有表达式。其他人则进行惰性评估,并且仅以未定义的顺序评估他们需要的内容。SQL(显然)可以选择自己的评估顺序以实现最佳短路评估。 (2认同)