我目前正在研究一个大桌子(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列上都有索引。
答案 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
尝试创建这些,然后重新运行查询。你应该看到很多改进的表现。