[英]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.