子查询很慢

时间:2019-05-09 13:23:33

标签: mysql sql

我有一个大约有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)

非常慢,需要几分钟才能完成。感觉这可以更快地完成。什么是最佳做法?

4 个答案:

答案 0 :(得分:5)

为什么不只是?

SELECT   id,
         MAX(date) date
FROM     tab
GROUP BY id;

答案 1 :(得分:1)

我假设要从表中获取更多列(否则,DanB的解决方案是最好的方法)。

我们将其分为两个步骤:

  1. 获取每个id的最长日期
  2. 获取所需数据

第一步很简单:

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;

这需要相同的索引,但不需要扫描整个表(以及索引)。