【问题标题】:Speed is slow in SQL query with a join, maybe indexes are the problem使用连接的 SQL 查询速度很慢,可能是索引问题
【发布时间】:2011-05-14 14:11:13
【问题描述】:

我目前正在处理一个大表(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 |日期 |状态 | +--------+------------+--------+----------+

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

【问题讨论】:

  • 您是否在 user_id 上创建了索引?
  • 你的表有没有包含id和日期的索引?
  • 你想通过where date IS NULL实现什么?因为我看到它的方式......你可能只得到那些没有日期的记录......在第一个表中
  • @ Misnomer 'Where date is null' 表示我只返回无法加入历史项目的记录。
  • @Robin-Timothy Card- 我推荐阅读 SQL odetocode.com/Articles/237.aspx 中的索引。

标签: mysql sql join


【解决方案1】:

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

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

【讨论】:

  • 但是如果没有正确的索引,它仍然会很慢。
  • @HLGEM 确实如此。我假设发布此内容的列已编入索引。
【解决方案2】:

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

这样的查询在优化方面并不多。您能做的最好的事情就是在 user_id 和可能的日期上添加一个索引。

【讨论】:

  • 如果我不做 WHERE date is null,我会返回所有记录。我只想要没有日期值的记录。
  • @Robin-Timothy Card - 你可以通过为两个日期字段放置 TableName.FieldName 来重新发布 sql。
  • 嗨 Jonm 只有一个日期字段。我将更新我的表格列的简化版本,请稍等。
  • @Robin-Timothy Card - 如果它只有一个日期字段,那么您的查询没有意义,因为您是基于一个值加入的。尝试将索引添加到 user_id 和日期。运行查询并给我们一些反馈,我敢打赌它运行得更快。
【解决方案3】:
select u.user_id 
from users u 
where u.user_id not in (select h.user_id from history h where h.date = '20101116');

【讨论】:

  • 这将返回与原始查询相同的结果(它甚至可能会针对相同的查询计划进行优化),但在 u.user_id、h.user_id 和 h.date 上没有索引,它赢了'执行得更快。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多