假设我有一个很长、开销很大的查询,其中充满了条件,正在搜索大量的行。我还有一个特殊的条件,比如公司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或者这样:
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) 发布于 2010-06-15 14:47:09
不,顺序不应该有很大的不同。在查找哪些行与条件匹配时,将为每行检查整个条件(通过布尔逻辑组合的所有子条件)。
一些智能数据库引擎将尝试猜测条件的哪些部分可以更快地求值(例如,不使用内置函数的部分),并首先计算这些部分,然后再计算更复杂(估计)的元素。但这是由DB引擎决定的,而不是由SQL决定的。
发布于 2016-11-15 22:30:31
由于短路,显示WHERE子句条件顺序的Here is a demo可能会有所不同。它运行以下查询:
-- 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故意休眠一秒钟,其副作用是每次运行时都会向日志表中添加一个条目。以下是运行这两个查询时记录的结果:
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性能?
是“有时候它可以做到。”
发布于 2010-06-15 15:11:18
where子句中列的顺序并不重要,因为MySQL会在执行查询之前对其进行优化。但我建议您阅读MySQL参考手册中关于Optimization的章节,以了解如何分析查询和表,并在必要时对其进行优化。但就我个人而言,我总是尝试将索引字段放在非索引字段之前,并根据它们应该返回的行数对它们进行排序(限制最多的条件在前,限制最少的条件在最后)。
https://stackoverflow.com/questions/3043042
复制相似问题