关于SQL中带OR的执行计划咨询

【 生产环境 】
【 OB 】
【 4.2.1.7 】
【问题描述】
当前有一条SQL:
SELECT
xxx
FROM
xxx
where did = ? or uuid in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) and ts >= xxx and ts < xxx order by ts desc limit 1",

问题1:
从OCP里看给优化成了


这样岂不是结果都有歧义了?

问题2:
索引我是应该建(did,ts)和(uuid,ts)两个联合索引还是(did,uuid,ts)这个联合索引

1、按照and和or的优先级来看 是没有问题 你可以用explain extended 来执行这两个语句 看看执行计划
2、建立(did,uuid,ts)这个索引就行

这个优先级应该要怎么看?OCP这个括号是对的么。我理解应该ts >= xxx and ts < xxx 同时生效吧

1、举例说明:
首先and的优先级大于or,通俗理解其实or查询其实会把条件分为左右两边来查。

    如 SELECT * FROM USER WHERE ID = 1 AND STATUS = 2 OR STATUS = 3,本来是想查询USER表中id为1的状态为2或者3的数据,其实只会这样执行,and比or优先,结果是查询id为1和状态为2,或者状态为3的数据。

    解决方法,如果是同字段,如上例子,可SELECT * FROM USER WHERE ID = 1 AND STATUS in (2,3),或者SELECT * FROM USER WHERE ID = 1 AND (STATUS = 2 OR STATUS = 3),就可以了。

2、你可以看看这个对sql的and和or的优先级解释
https://blog.csdn.net/Vienna910/article/details/142268334?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-2-142268334-blog-80665969.235^v43^pc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-2-142268334-blog-80665969.235^v43^pc_blog_bottom_relevance_base4&utm_relevant_index=3

如果我把条件改成
where (did = ? or uuid in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ) and ts >= xxx and ts < xxx order by ts desc limit 1",

此时已经有了(did,ts) (uuid,ts)两个联合索引,还需要加(did,uuid,ts)联合索引吗

需要加(did,uuid,ts)联合索引

:joy:为啥呀。不会两个索引 然后union 吗

有个奇怪的现象,我不管加不加这个三个字段的联合索引,explain查看都是扫的全表

where (did = ? or uuid in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ) 你这个是一个整体 怎么union all呀 你可以看看执行计划 你就明白了 你也可以看看sql方面的书籍或者文档

明白了。但是加上联合索引现在看也没生效。

索引:KEY DID (did, uuid, ts) BLOCK_SIZE 16384 LOCAL

SQL条件:where (did = ? or uuid in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ) and ts >= xxx and ts < xxx order by ts desc limit 1",

explain extended 执行 发一个全的文本 具体看一下 隐藏一些信息就行 具体能看到点信息




把表名换成了table

额 我明白了。有个类型转换

我刚刚删掉三个字段的联合索引又试了下。发现其实原来的两个索引(did,ts) (uuid,ts)是可以生效的。

你把这个信息 展示出来看看

是的 就是有个类型转化 我看执行计划 没有看到union all展开 后面你发这个执行计划 符合预期