mysql - 基于 3 个条件选择 3 行的最佳 MySQL 索引和查询

标签 mysql sql indexing query-optimization

我有一个 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 个条件选择 3 个特定记录。总有 3 条记录满足所有 3 个条件。

这是我提出的有效查询:

SELECT 
  cat, 
  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:该表的最佳索引结构是什么?

提前致谢!

最佳答案

我会在(猫、颜色、尺寸) 上创建索引。在这种情况下,索引中列的顺序并不重要,因为您在所有情况下都使用 = 进行比较。

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 - 基于 3 个条件选择 3 行的最佳 MySQL 索引和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72395444/

相关文章:

java - 结果集和 SQL 函数

sql - 如何为属性未知的数据建模?

php - 导致列计数与第 1 行的值计数不匹配的 SQL 语句有什么问题?

mysql - 为什么在表有某种关系时即使在使用多线程之后也需要很长时间才能在 mysql 表中插入行

mysql - MySQL的ANSI和Unicode驱动的区别

MySQL 到 JSON 不一致提取

php - 用变量访问对象属性?

postgresql - 未使用 Postgres GIN 索引,始终进行 SEQ 扫描

Python:将for循环中的索引合并为列表名称的一部分

sql - 为什么这个 postgresql text_pattern_ops 索引不在函数体内使用?