首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WHERE子句中条件的顺序是否会影响MySQL性能?

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

Stack Overflow用户
提问于 2010-06-15 14:44:29
回答 8查看 17.2K关注 0票数 48

假设我有一个很长、开销很大的查询,其中充满了条件,正在搜索大量的行。我还有一个特殊的条件,比如公司id,它将大大限制需要搜索的行数,将搜索行数从数十万缩小到几十。

我是否这样做对MySQL性能有影响:

代码语言:javascript
复制
 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

或者这样:

代码语言:javascript
复制
 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) 
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-06-15 14:47:09

不,顺序不应该有很大的不同。在查找哪些行与条件匹配时,将为每行检查整个条件(通过布尔逻辑组合的所有子条件)。

一些智能数据库引擎将尝试猜测条件的哪些部分可以更快地求值(例如,不使用内置函数的部分),并首先计算这些部分,然后再计算更复杂(估计)的元素。但这是由DB引擎决定的,而不是由SQL决定的。

票数 20
EN

Stack Overflow用户

发布于 2016-11-15 22:30:31

由于短路,显示WHERE子句条件顺序的Here is a demo可能会有所不同。它运行以下查询:

代码语言:javascript
复制
-- 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;

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

myslowfunction故意休眠一秒钟,其副作用是每次运行时都会向日志表中添加一个条目。以下是运行这两个查询时记录的结果:

代码语言:javascript
复制
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

上图显示,当一个慢函数出现在OR条件的左侧,而另一个操作数并不总是真时,该慢函数执行的次数会更多。

所以我给出了问题的答案:

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

是“有时候它可以做到。”

票数 32
EN

Stack Overflow用户

发布于 2010-06-15 15:11:18

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3043042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档