我有 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_id
和 type_id
,但不能直接用于日期。
关于mysql - MySQL如何使用多字段索引进行中间索引字段为OR的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189481/