根据 3 个条件选择 3 行的最佳 MySQL 索引和查询
Optimal MySQL indexes and query for selecting 3 rows based on 3 conditions
我有一个 MySQL table 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 |
+----+-----+--------+------+---------+
我需要 select 基于 3 个条件的 3 个特定记录,使用单个 MySQL 查询。总会有恰好 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:此 table 的最佳索引结构是什么?
提前致谢!
我会在 (cat, color, size)
上创建一个索引。在这种情况下,索引中列的顺序无关紧要,因为您在所有情况下都使用 =
进行比较。
MySQL的IN()
predicate supports row constructor comparison syntax, and current versions of MySQL do support index optimization for row constructor expressions(旧版本的MySQL没有,但这些版本现在都已经过了end-of-life)。
SELECT
category,
color,
size,
descr
FROM
products
WHERE (cat, color, size) IN (
(1, 'red', 1),
(2, 'orange', 1),
(2, 'blue', 3)
)
我有一个 MySQL table 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 |
+----+-----+--------+------+---------+
我需要 select 基于 3 个条件的 3 个特定记录,使用单个 MySQL 查询。总会有恰好 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:此 table 的最佳索引结构是什么?
提前致谢!
我会在 (cat, color, size)
上创建一个索引。在这种情况下,索引中列的顺序无关紧要,因为您在所有情况下都使用 =
进行比较。
MySQL的IN()
predicate supports row constructor comparison syntax, and current versions of MySQL do support index optimization for row constructor expressions(旧版本的MySQL没有,但这些版本现在都已经过了end-of-life)。
SELECT
category,
color,
size,
descr
FROM
products
WHERE (cat, color, size) IN (
(1, 'red', 1),
(2, 'orange', 1),
(2, 'blue', 3)
)