我目前正在尝试查询一个包含三个in子句的表格,如下:
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”被更改为“=”都是一样的。 我的问题是:对于一个带有索引的查询,您可以使用in语句的数量吗?我是否遗漏了什么明显的东西? 关于该表需要了解几件事: 大小约为9 GB,包含大量文本列(JSON字段),但此列不是上述查询列中的任何一列。上面显示的in语句可能会大得多(200-300项)。 谢谢! 编辑: 以下是查询的explain输出(使用“FORCE INDEX”): 1,“SIMPLE”,“table”,“ALL”,“correct_index”,NULL,NULL,NULL,6977553,“Using where” 其中正确的索引是上面解释的(index(a,b,c,d,date))。