首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子查询速度慢

子查询速度慢
EN

Stack Overflow用户
提问于 2019-05-09 13:23:33
回答 4查看 210关注 0票数 3

我有一个mysql表,大约有1000万行。对于每一行,我都有一个id列和date列。id列并不是唯一的,对于一个iddate有多个值不同的行,通常每个id的日期为3-6个。我希望使用最新的date为它们的id选择行。

我的问题是:

代码语言:javascript
复制
SELECT   id,
         date
FROM     tab a
WHERE    a.date = (SELECT MAX(date)
                   FROM   tab b
                   WHERE  a.id=b.id)

非常慢,需要几分钟才能完成。它认为这可以做得更快。这里的最佳实践是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-09 13:26:04

为什么不只是?

代码语言:javascript
复制
SELECT   id,
         MAX(date) date
FROM     tab
GROUP BY id;
票数 5
EN

Stack Overflow用户

发布于 2019-05-09 14:06:21

我将假设您希望从表中获得更多列(否则,DanB的解决方案是最好的方法)。

让我们将其分成两个步骤:

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

第一步很简单:

代码语言:javascript
复制
SELECT id, max(date)
FROM tab
GROUP BY id

重要:必须对两个列进行索引。

现在,第二步是困难的部分。如何获取所需的所有数据?

我要做的是:

  • 创建一个具有上述查询结果的临时表,
  • 索引它,和
  • 使用这个新的临时表加入该表。

那么,让我们试试:

代码语言:javascript
复制
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;

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2019-05-09 13:53:38

首先:id应该是独一无二的,这就是他们的目的。

现在我的建议是:

代码语言:javascript
复制
select
  id,
  max(date) as latest_date
from a

join b
  on b.id = a.id

group by a.id

order by latest_date;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56060431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档