考虑这个表:MySQL可能会根据提供的静态数据列表加入表格吗?
TABLE names
+-------+-------+-----+-------------+
| id | f_key |name | sort_metric |
+-------+-------+-----+-------------+
| 1 | 1 | a | 1 |
| 2 | 1 | b | 2 |
| 3 | 1 | c | 0 |
| 4 | 2 | d | 0 |
| 5 | 2 | e | 2 |
| 6 | 2 | f | 1 |
| 7 | 3 | g | 1 |
| 8 | 3 | h | 0 |
...
| 9999 | 2500 | zzz | 2 |
| 10000 | 2500 | zzz | 0 |
+-------+-------+-----+-------------+
有此表近10000行。我有一个查询,它返回正确的结果,但似乎是乞求优化。
查询返回从该表中通过(sort_metric
,id
)对于每个f_key
下令f_key
和name
。这个查询经常运行,所以我想尽可能提高效率。
SELECT
name_a.f_key, name_a.name
FROM (
SELECT
DISCTINCT f_key
FROM
names
WHERE
f_key IN (254, 257, ..., 273, 279)
) f_keys
JOIN names names_a ON names_a.id = (
SELECT
names_b.id
FROM
names names_b
WHERE
names_b.f_key = f_keys.f_key
ORDER BY
sort_metric ASC, id ASC LIMIT 1
)
IN(...)子句中的项目数每次都是24,但这些项目不是顺序的,并且经常变化。 id
是主键和我对(f_key
)和(sort_metric
,id
)额外的索引。
尤其是派生表SELECT DISTINCT f_key FROM names WHERE f_key IN (254, 257, ..., 273, 279)
似乎傻我。是否没有办法更有效地使用静态提供的列表作为派生表?我无法弄清楚如何做到这一点。任何人?
谢谢你。我能够a)理解它并且b)使其适应我的项目,并且它似乎工作。 (我看到你做了一些编辑,我必须做出相同的编辑=) – mkoistinen