mysql - MySQL如何使用多字段索引进行中间索引字段为OR的查询?

标签 mysql sql indexing query-optimization innodb

我有 InnoDB 表项目,具有多列非唯一索引(group_id、type_id、expiry_date)。

查询时 SELECT * FROM Items WHERE group_id = 1 AND type_id IN (1,2,3) AND expiry_date BETWEEN '2017-01-01' AND '2018-01-01'

索引是否可以正常工作,因为我使用 IN 作为索引的第二个字段,并且它们还具有第三个意志的范围,或者我应该从吐出它中受益?

SELECT * FROM Items WHERE group_id = 1 AND type_id = 1 AND expiry_date BETWEEN '2017-01-01' AND '2018-01-01' 之间 联盟 SELECT * FROM Items WHERE group_id = 1 AND type_id = 2 AND expiry_date BETWEEN '2017-01-01' AND '2018-01-01' 之间 联盟 SELECT * FROM Items WHERE group_id = 1 AND type_id = 3 AND expiry_date BETWEEN '2017-01-01' AND '2018-01-01' 之间

EXPLAIN 显示了两个查询的相同查询计划,但我有一个相当小的表用于测试,不确定查询优化器是否会以相同的方式处理大量数据。

对于索引中的 2 个后续字段使用 IN/OR/BETWEEN 的情况,索引通常如何工作?

最佳答案

对于第二个查询,请使用 union all 而不是 union。您总是希望union all,除非您想承担删除重复项的开销。

我猜您会从对较大数据的第二个查询中受益。我认为 MySQL 不支持对索引进行跳跃扫描,因此索引仅用于 group_idtype_id,但不能直接用于日期。

关于mysql - MySQL如何使用多字段索引进行中间索引字段为OR的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189481/

相关文章:

java - 相同的值多次添加到数据库中

mysql - 获取具有相同 mid 的其他 user_ids

mysql - node.js/node_mysql - 过时的连接得到 "NO database selected"错误

sql - 为什么批量插入/更新速度更快?批量更新如何进行?

java - 无需安装 SQL Server 即可通过 JDBC 连接到远程服务器

MySQL - 创建的索引没有显示为可能的键

c++ - 什么是置换索引?

php - 为什么我更改为 session 后,MySql db 中出现的特殊字符很奇怪?

sql - 在 AWS Athena 中添加截止日期列

sql-server - 帮助了解索引上的多个列?