我对where条款的订购有问题。
从其他问题中可以看出,where子句的顺序不会影响sql查询的性能,但是随着顺序的改变,我的查询性能也会发生变化。
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'比
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”和“时间戳”进行了索引。
知道为什么吗??
发布于 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列的综合指数?(两者有很大的不同。)这些建议是可取的:
rr: INDEX(timestamp)
xx: INDEX(midx, name)发布于 2016-12-28 07:06:15
https://stackoverflow.com/questions/41356999
复制相似问题