带有索引的多列SQL过滤

时间:2010-12-27 14:40:24

标签: sql mysql

我想展开a question I posted a while ago

我正在查询表中的行,其中列对位于特定集合中。例如,请考虑下表:

    id | f1  | f2
    -------------
    1  | 'a' | 20
    2  | 'b' | 20
    3  | 'a' | 30
    4  | 'b' | 20
    5  | 'c' | 20

我希望提取(f1,f2)对在指定的一对对中的行,例如(('a',30),('b',20),...)。在原始问题中,Mark正确回答我可以使用以下语法:

SELECT * FROM my_table WHERE (f1,f2) IN (('a',30), ('b',20))

这很好用,但我看到一些关于索引的意外行为:
我为f1,f2定义了一个多列索引,名为 IndexF1F2 。使用EXPLAIN短语,我看到MySql使用索引进行单个比较,例如:

SELECT * FROM my_table WHERE (f1,f2) = ('a',30)

但不是在使用'IN'子句时,如上例所示。给出提示,例如USE INDEX(IndexF1F2)甚至FORCE INDEX(IndexF1F2)似乎没有任何区别。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是MySQL中的known bug

使用以下语法:

SELECT  *
FROM    composite
WHERE   (f1, f2) = ('a', 30)
        OR (f1, f2) = ('b', 20)