SQL 通过带索引的多列过滤

标签 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),似乎没有任何区别。

有什么想法吗?

最佳答案

这是一个 known bugMySQL 中。

使用这个语法:

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

关于SQL 通过带索引的多列过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4539395/

相关文章:

mysql - 如何在父子关系表中找到无菌节点?

php - 插入 php mysql 的正确语法是什么。 W 或 W/O session 变量

sql - 用于遍历有向图并返回找到的所有边的 PostgreSQL SQL 或 PL/pgSQL 查询

sql - 在 SQL Server 中使用具有两个条目(值)的同一个表中的另一列更新列

sql - 在 SQL Server 上生成下一个字母数字代码

c# - LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法无法转换为存储表达式

mysql仅授予对一个表及其某些列的选择权限

php - 关于在 php 中上传 csv 文件不清楚

mysql - Travis 构建失败,并出现错误 LOAD DATA LOCAL INFILE 文件请求因访问限制而被拒绝

mysql - LEFT OUTER JOIN,左表没有重复项