我目前正在尝试查询具有多个 (3) 子句的表,例如:
SELECT *
FROM table
WHERE
a IN (2884,5320)
AND
b IN ('a', 'b', 'c')
AND
c IN (1, 2, 3)
AND d='abcd'
AND date BETWEEN 0 AND 1383177599
该表的索引如下index(a, b, c, d, date)
但是,当我对查询运行解释时,解释器显示没有合适的索引可供使用。即使我仍然如此FORCE INDEX
。
如果我将上述其中一个更改IN
为=
诸如
SELECT *
FROM table
WHERE
a = 2884
AND
b IN ('a', 'b', 'c')
AND
c IN (1, 2, 3)
AND d = 'abcd'
AND date BETWEEN 0 AND 1383177599
MySQL 将允许我强制它使用索引,但否则会选择另一个非覆盖索引。无论将哪个IN
s 更改为 ,情况都是如此=
。
我的问题:
可用于索引查询的 in 子句的数量是否有限制?我在这里有什么明显的遗漏吗?
关于该表需要了解的几件事:
9 GB,约 8,000,000 行。它包含一个可能非常大的文本列(一个 JSON 字段),但该列不是上面查询到的任何列。上面显示的 in 子句可能要大得多(200-300 项)
谢谢!
编辑:
这是查询中解释的输出(带有FORCE INDEX
)
1,"SIMPLE","table","ALL","correct_index",NULL,NULL,NULL,6977553,"Using where"
其中正确的索引是上面解释的索引(index(a, b, c, d, date)
)