假设我有一个冗长,昂贵的查询,包含条件,搜索大量行.我还有一个特殊的条件,比如公司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.
数学上是的它有效果。不仅在 SQL 查询中。而是在所有编程语言中,只要有and/表达式or。有一种完全评价或部分评价的理论。如果它的一个和查询和第一个表达式的and计算结果为假,它将不会进一步检查。as anding false 任何东西都会产生 false 。同样,在 or 表达式中,如果第一个为真,则不会进一步检查。