我有一个大约有1000万行的mysql表。
对于每一行,我都有一个id
列和一个date
列。 id
列不是唯一的,并且对于一个id
,有多行具有不同的date
值,通常每个id
具有3-6个日期。我想为其date
选择具有最新id
的行。
我的查询:
SELECT id,
date
FROM tab a
WHERE a.date = (SELECT MAX(date)
FROM tab b
WHERE a.id=b.id)
非常慢,需要几分钟才能完成。感觉这可以更快地完成。什么是最佳做法?
答案 0 :(得分:5)
为什么不只是?
SELECT id,
MAX(date) date
FROM tab
GROUP BY id;
答案 1 :(得分:1)
我假设要从表中获取更多列(否则,DanB的解决方案是最好的方法)。
我们将其分为两个步骤:
id
的最长日期第一步很简单:
id
重要提示:两个列都必须建立索引。
现在,第二步是困难的部分。如何获取所需的所有数据?
我要做的是:
所以,让我们尝试一下:
SELECT id, max(date)
FROM tab
GROUP BY id
希望这会有所帮助。
答案 2 :(得分:0)
首先: id 应该是唯一的。那是他们的目的。
现在我的建议:
select
id,
max(date) as latest_date
from a
join b
on b.id = a.id
group by a.id
order by latest_date;
答案 3 :(得分:0)
您的查询可能是解决此问题的最快方法。但是,您绝对需要在tab(id, date)
上使用索引以提高性能。索引中的两列。
如果您有另一个id表,那么以下通常是最快的方法:
select ids.id,
(select max(t.date)
from tab t
where t.id = ids.id
) as max_date;
这需要相同的索引,但不需要扫描整个表(以及索引)。