使用连接的SQL查询的速度很慢,可能索引是问题

时间:2010-11-23 16:36:36

标签: mysql sql join

我目前正在研究一个大桌子(150k行和计数),虽然它更小,我正在尝试的查询要快得多,但随着它的增长,它非常慢,即使我限制1,它也可以最多需要五分钟。我需要加快速度。

有两个表,一个用户表(大约5000条记录)和一种历史表(大约150,000条记录),其中有两列是该日期的日期和状态。

该查询是一个选择,用于查找的用户在指定日期拥有历史记录。

我现在要做的是如下:

select 
  u.user_id 
from 
  users u 
  left join history h on u.id= h.user_id and date = '20101116' 
where 
  date IS NULL;

这是如何工作的我是加入日期20101116(YYYYMMDD格式),如果加入表格日期值是null,我知道我没有关于该日期的历史记录给定日期。这有效,但速度非常慢,我想知道是否有更快/更聪明的方法。

因此我的表格是:

用户

+------+-----------------+
|  id  |  email_address  |
+------+-----------------+

记录

+------+-----------+--------+----------+
|  id  |  user_id  |  date  |  status  |
+------+-----------+--------+----------+

我只在两个表的ID列上都有索引。

4 个答案:

答案 0 :(得分:4)

  

该查询是一个选择,用于查找在给定日期没有历史记录的用户。

select u.user_id 
from users,  history h
where u.user_id = h.user_id 
and not exists ( select 1 
                 from history 
                 where h.user_id = u.user_id 
                 and h.date = '20101116' )

答案 1 :(得分:1)

WHERE日期没有理由为null,因为您已加入特定日期。对我来说,没有意义。除非你在讨论两个不同的日期字段,但是你没有在它们的例子中给它们命名或者说它们有别名吗?

在这种查询的优化方面没有多少。您可以做的最好的事情是在user_id和可能的日期上抛出一个索引。

答案 2 :(得分:1)

select u.user_id 
from users u 
where u.user_id not in (select h.user_id from history h where h.date = '20101116');

答案 3 :(得分:0)

为了使您的查询更快,您需要向history表添加两个索引:

  • history.user_id
  • 上的索引
  • history.date
  • 上的索引

尝试创建这些,然后重新运行查询。你应该看到很多改进的表现。