繁体   English   中英

带联接的SQL查询的速度很慢,可能是索引问题

[英]Speed is slow in SQL query with a join, maybe indexes are the problem

我目前正在处理一个大表(行数为15万,正在计数),虽然表较小,但是我尝试的查询速度却要快得多,但是随着它的增长,它的运行速度非常慢,即使我限制为1,它也可能占用最多5分钟。 我需要加快速度。

有两个表,一个用户表(大约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列上都有索引。

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

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' )

WHERE日期为空没有任何理由,因为您已经在特定日期加入。 对我而言,这没有任何意义。 除非您谈论的是两个不同的日期字段,但在示例中没有对它们命名或别名很好?

在这种查询上没有太多优化方面的内容。 您能做的最好的事情是在user_id以及日期上添加一个索引。

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

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

  • history.user_id索引
  • history.date索引

尝试创建这些,然后重新运行查询。 您应该看到性能大大提高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM