请你帮我优化这个查询。我花了很多时间,并且仍然无法将其改写成足够快的速度(比如说运行在秒钟之内,而不是现在的分钟)。MySQL查询优化
查询:
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_value
每个my_id
一些时间戳之前。 my_table
包含约1亿个条目,并且需要大约8分钟才能完成。
解释:
+----+-------------+-------------+-------+------------------------------------------------+-------------------------+---------+---------------------------+-------+---------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------------+-------+------------------------------------------------+-------------------------+---------+---------------------------+-------+---------------------------------------+ | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 90721 | Using temporary; Using filesort | | 1 | PRIMARY | m | ref | MY_ID_IDX,MY_TIMESTAMP_IDX,MY_ID_TIMESTAMP_IDX | MY_TIMESTAMP_IDX | 4 | tmp.most_recent_timestamp | 1 | Using where | | 2 | DERIVED | my_table | range | MY_TIMESTAMP_IDX | MY_ID_MY_TIMESTAMP_IDX | 8 | NULL | 61337 | Using where; Using index for group-by | +----+-------------+-------------+-------+------------------------------------------------+-----------------------+---------+---------------------------+------+---------------------------------------+
您确定这是您发布的查询的查询计划吗?该计划提到表“nv”,但查询中没有这样的表。该查询可能不是正确的,因为子选择中的my_id的值可能不是(实际上不可能是)my_timestamp = MAX(my_timestamp)所在行的id。 – outis 2011-03-02 14:26:49
哪个版本的mysql?以及为什么表名1被删除。 – Zimbabao 2011-03-02 14:27:58
不应该将您的连接条件设为'... AND tmp.most_recent_timestamp = m.my_timestamp ...'?内部查询也看起来缺少一个“GROUP BY”。 – 2011-03-02 14:32:28