【问题标题】:slow to orderby desc on left join左连接上的 desc 排序缓慢
【发布时间】:2019-08-18 22:07:03
【问题描述】:

您好,我需要一点帮助。

我写了下面的左连接查询,它在没有 ORDER BY 的情况下运行良好

select members.membership_no,members.first_name,members.last_name,employment.position,members.start_date 
from members 
LEFT JOIN employment ON employment.membership_no=members.membership_no limit 10

但是一旦我添加 ORDER BY DESC 到它,它就变得非常慢。

select members.membership_no,members.first_name,members.last_name,employment.position,members.start_date 
from members 
LEFT JOIN employment ON employment.membership_no=members.membership_no  
ORDER BY members.membership_no DESC  limit 10

我做错了什么吗?,我怎样才能做到这一点左加入并按降序获得结果但仅限于 10 个结果,还有其他方法吗?

【问题讨论】:

  • 是否有 members.membership_no 的索引(或者是主键)?
  • 谢谢我现在明白了,似乎membership_no 不是主键,而是自动递增id 列,所以我只是将membership_no 设置为索引,现在它可以工作了......谢谢。
  • 随时提交(并接受)此作为答案/删除问题

标签: mysql sql


【解决方案1】:

此查询实例中的问题是,通过在查询中使用 ORDER BY,如果 ORDER BY 表达式不同,MySQL 将无法使用索引。

相关链接:

【讨论】:

  • “如果 ORDER BY 表达式不同。”你可能想改写一下。
【解决方案2】:

使用左连接进行 ORDER BY DESC 的重要说明。

表 a 和 b 都必须有索引,如果您碰巧在没有索引或不是主键的列上进行连接,则必须在该列上设置索引。

所以在上面的查询中,membership_no 不是主键,而是自动递增 id 列,所以我只是将 members_no 设置为它工作的索引

【讨论】:

  • 请发布您的 A) 当前查询和 B) SHOW CREATE TABLE 就业; C) SHOW CREATE 成员;所以我们可以看到你的结束查询和表定义。谢谢
【解决方案3】:

你在比较苹果和橘子。 order by 子句在查询中有很大的不同。

没有order by,MySQL 可以只运行结果并返回找到的行。它会很快找到 10 并停止。

使用order by,MySQL 需要生成整个结果集,然后对其进行排序。只有在排序之后才能获取前 10 行。这是一个更长的过程。

您使用的是LEFT JOIN,因此第一个表中的所有行都保存在结果集中。您可以通过首先过滤到 10 个成员、运行查询并再次过滤来优化此特定查询:

select m.membership_no, m.first_name, m.last_name, e.position, m.start_date 
from (select m.*
      from members m
      order by m.membership_no desc
      limit 10
     ) m left join
     employment e 
     on e.membership_no = m.membership_no  
order by m.membership_no desc
limit 10;

【讨论】:

  • 感谢您的帮助真的很有帮助,但我为我的情况解决了这个问题,缓慢确实是索引,而且我犯了一个愚蠢的错误,即我的 members_no 是 2 种不同的数据类型,在一个十进制表和另一个 varchar 。所以我将查询从 3 秒转换为 4 秒到 0.032 秒。只是为了比较,我使用您提供的 sub select 对 10k 记录进行了测试,其时间为 0.063 秒,而我使用左连接 10k 记录的时间为 0.032 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2016-11-21
  • 2015-11-02
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多