首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么何地条款的顺序会影响绩效?

为什么何地条款的顺序会影响绩效?
EN

Stack Overflow用户
提问于 2016-12-28 07:04:28
回答 2查看 50关注 0票数 0

我对where条款的订购有问题。

从其他问题中可以看出,where子句的顺序不会影响sql查询的性能,但是随着顺序的改变,我的查询性能也会发生变化。

代码语言:javascript
复制
select sql_no_cache idx
from rr
where (timestamp >= '2016-11-28' and timestamp <= '2016-12-28')
  and ((select name from xx where midx=rr.midx) like 'test'

代码语言:javascript
复制
select sql_no_cache idx
from rr
where ((select name from xx where midx=rr.midx) like 'test'
  and (timestamp >= '2016-11-28' and timestamp <= '2016-12-28')

表rr对“idx”、“midx”和“时间戳”进行了索引。

知道为什么吗??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-28 20:14:10

如果所有信息都是现成的,优化器将查看WHERE的所有部分,然后决定首先执行哪些部分。当该顺序在语义上不相关时,则忽略该顺序。

一个规则,实际上是作为一个优化,是MATCH...AGAINST将首先被执行。

然而,在一些情况下(如您的),优化器不知道哪一部分会更好。因此,它转而希望用户知道得最好;短路可能会在性能上产生巨大的变化。

括号不控制顺序,只控制语义。(它们通常只是多余的。)

(select name from xx where midx=rr.midx) like 'test'可以转化为EXISTS (SELECT * FROM xx WHERE midx=rr.midx AND name = 'test') --优化器确实理解EXISTS(...),并且比您的公式做得更好。

“表rr对'idx‘、'midx’和‘时间戳’有索引”--含糊不清。那是三个1列索引吗?还是一个3列的综合指数?(两者有很大的不同。)这些建议是可取的:

代码语言:javascript
复制
rr:  INDEX(timestamp)
xx:  INDEX(midx, name)
票数 0
EN

Stack Overflow用户

发布于 2016-12-28 07:06:15

我的猜测是,这是由于短路,基本上子select只在时间戳条件为真时才执行。

当大多数行的时间戳条件为真时,您可能会得到相同的性能结果。

This SO has some info on this.

And also this one, marked as duplicate as the former.

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

https://stackoverflow.com/questions/41356999

复制
相关文章

相似问题

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