我有一个mysql表,大约有1000万行。对于每一行,我都有一个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)非常慢,需要几分钟才能完成。它认为这可以做得更快。这里的最佳实践是什么?
发布于 2019-05-09 13:26:04
为什么不只是?
SELECT id,
MAX(date) date
FROM tab
GROUP BY id;发布于 2019-05-09 14:06:21
我将假设您希望从表中获得更多列(否则,DanB的解决方案是最好的方法)。
让我们将其分成两个步骤:
id的最大日期第一步很简单:
SELECT id, max(date)
FROM tab
GROUP BY id重要:必须对两个列进行索引。
现在,第二步是困难的部分。如何获取所需的所有数据?
我要做的是:
那么,让我们试试:
CREATE TEMPORARY TABLE temp_dates
SELECT id, max(date) as mdate
FROM tab
GROUP BY id;
ALTER TABLE temp_dates
ADD UNIQUE INDEX u_id (id),
ADD INDEX i_mdate (mdate);
SELECT a.id, a.date -- Add all the columns you need
FROM tab AS a
INNER JOIN temp_dates AS b ON a.id=b.id and a.date=b.mdate;希望这能有所帮助。
发布于 2019-05-09 13:53:38
首先: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;https://stackoverflow.com/questions/56060431
复制相似问题