我有一个MySQL表products,大约有10k行,如下所示:

+----+-----+--------+------+---------+
| id | cat | color  | size |  descr  |
+----+-----+--------+------+---------+
|  1 |   1 | red    |    1 | Lorem 1 |
|  2 |   1 | green  |    2 | Lorem 2 |
|  3 |   2 | orange |    1 | Lorem 3 |
|  4 |   2 | blue   |    3 | Lorem 4 |
+----+-----+--------+------+---------+

我需要使用一个MySQL查询,根据3个条件 Select 3个特定记录.始终会有正好3条记录满足所有3个条件.

以下是我提出的一个有效的问题:

SELECT 
  category, 
  color, 
  size, 
  descr 
FROM 
  products 
WHERE 
  (
    cat = 1 
    AND color = 'red' 
    AND size = 1
  ) 
  OR (
    cat = 2 
    and color = 'orange' 
    and size = 1
  ) 
  OR (
    cat = 2 
    AND color = 'blue' 
    AND size = 3
  )

问题1:这是基于3个条件检索3条记录的最佳查询吗?

问题2:此表的最佳索引 struct 是什么?

提前感谢!

推荐答案

我会在(cat, color, size)上创建一个索引.在这种情况下,索引中列的顺序并不重要,因为在所有情况下都使用=进行比较.

MySQL的IN() predicate支持行构造函数比较语法,MySQL的当前版本确实支持index optimization for row constructor expressions(MySQL的旧版本不支持,但这些版本现在都已经过期).

SELECT 
  category, 
  color, 
  size, 
  descr 
FROM 
  products 
WHERE (cat, color, size) IN (
    (1, 'red', 1),
    (2, 'orange', 1),
    (2, 'blue', 3)
)

Mysql相关问答推荐

MYSQL子查询

查找关联数据库表的超集

MySQL查询获取图书的唯一读取页面数

SQL计算不同的列并返回所有行

MySQL 8.0.34-从后端系统管理AWS RDS上的持久连接内存使用

MySQL:返回所有条件(但不满足其他条件)为真的所有结果

如果我有USER列,如何将SQL CREATE TABLE与PostgreSQL和MySQL一起使用?

无法连接到扩展坞MySQL Unix套接字

带有值分隔的MySQL分组不起作用

布尔值之间的 SQL less/greater 比较会产生意外结果

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

基于多个 where 子句在规范化表中查找公共 ID(值)

使用适配器设计模式和外观设计模式实现

需要按总金额检索前 3 个供应商,每个类别 - 子类别

通过 Gorm 查询模型

DECIMAL(m, n) 在 64 位系统中如何表示?

MySql 以秒为单位的两个时间戳之间的差异?

使用 Java 通过 SSH 连接到远程 MySQL 数据库

'LIKE ('%this%' OR '%that%') and something=else' 不起作用

MySQL合并两列并添加到一个新列中