【发布时间】:2011-07-07 07:53:31
【问题描述】:
您能帮我优化这个查询吗?我花了很多时间,但仍然无法将其改写为足够快(比如在几秒钟内运行,而不是现在的几分钟)。
查询:
SELECT m.my_id, m.my_value, m.my_timestamp
FROM (
SELECT my_id, MAX(my_timestamp) AS most_recent_timestamp
FROM my_table
WHERE my_timestamp < '2011-03-01 08:00:00'
GROUP BY my_id
) as tmp
LEFT OUTER JOIN my_table m
ON tmp.my_id = m.my_id AND tmp.most_recent_timestamp = m.my_timestamp
ORDER BY m.my_timestamp;
my_table 定义如下:
CREATE TABLE my_table (
my_id INTEGER NOT NULL,
my_value VARCHAR(4000),
my_timestamp TIMESTAMP default CURRENT_TIMESTAMP NOT NULL,
INDEX MY_ID_IDX (my_id),
INDEX MY_TIMESTAMP_IDX (my_timestamp),
INDEX MY_ID_MY_TIMESTAMP_IDX (my_id, my_timestamp)
);
此查询的目标是在某个时间戳之前为每个 my_id 选择最近的 my_value。 my_table 包含约 1 亿个条目,执行它需要约 8 分钟。
解释:
+----+-------------+-------------+--------+-------- ----------------------------------------------------+--------- ----------------+----------+------------------------ ----+--------+-------------------------- --+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+-------------+--------+-------- ----------------------------------------------------+--------- ----------------+----------+------------------------ ----+--------+-------------------------- --+ | 1 |初级 | |全部 |空 |空 |空 |空 | 90721 |使用临时的;使用文件排序 | | 1 |初级 |米 |参考 | MY_ID_IDX,MY_TIMESTAMP_IDX,MY_ID_TIMESTAMP_IDX | MY_TIMESTAMP_IDX | 4 | tmp.most_recent_timestamp | 1 |使用位置 | | 2 |派生 |我的表 |范围 | MY_TIMESTAMP_IDX | MY_ID_MY_TIMESTAMP_IDX | 8 |空 | 61337 |使用哪里;使用索引进行分组 | +----+-------------+-------------+--------+-------- ----------------------------------------------------+--------- --------------+---------+-------------- --+--------+----------------------------------------------------+【问题讨论】:
-
您确定这是您发布的查询的查询计划吗?该计划提到表
nv,但查询中没有这样的表。查询甚至可能不正确,因为子选择中my_id的值可能不是(实际上不太可能是)my_timestamp = MAX(my_timestamp)所在行的 id。 -
哪个版本的mysql?以及为什么删除表名 1。
-
你的加入条件不应该是
...AND tmp.most_recent_timestamp = m.my_timestamp...吗?内部查询似乎也缺少GROUP BY。 -
您能解释一下“SELECT my_id, MAX(my_timestamp) AS ..” 的作用以及为什么没有分组依据吗?
-
@outis,对不起。我已经修改了生产数据库中的原始解释,可能存在不一致之处。我试图纠正它们。| @Joe Stefanelli,是的。似乎我在准备和 SCCE 时错过了它。 @Zimbabao,mysql 5.1 版。
标签: mysql sql query-optimization