mysql - order by 和 unique 对性能有影响

标签 mysql sql performance

我有 60 万个数据集。现在我尝试按时间戳对数据集进行排序,并且由于一对多关系,我必须进行一些内部联接并使用不同的。

我的查询如下,

SELECT DISTINCT p.id, s.subject, p.joining_time
       FROM profile p
       INNER JOIN profile_subject ps ON p.id=ps.profile_id
       LEFT JOIN subject s ON ps.subject_id=s.id
       ORDER BY p.joining_time LIMIT 20;

现在这个查询花费了近 28 秒 但如果没有 order by 子句,只需要 0.11 秒

如何改进此查询以获得所需的结果?

最佳答案

我最简单的建议是在profile(joining_time)上放置一个索引。然后在子查询中选择一定数量的最新的。例如,如果您非常有信心所需的前 20 行位于 profile 中最近的 100 条记录内,那么您可以尝试以下操作:

SELECT DISTINCT p.id, s.subject, p.joining_time
FROM (SELECT p.id, p.joining_join
      FROM profile p
      ORDER BY p.joining_time
      LIMIT 100
     ) p INNER JOIN
     profile_subject ps
     ON p.id = ps.profile_id LEFT JOIN
     subject s
     ON ps.subject_id = s.id
ORDER BY p.joining_time
LIMIT 20;

我还建议您删除 DISTINCT 关键字。除非您的一份个人资料有重复的主题,否则这是没有必要的。同样,很难相信 LEFT JOIN 是必要的。在结构良好的数据库中,profile_subject 中不存在 subject 中不存在的 subject_id 值。所以,试试这个:

SELECT p.id, s.subject, p.joining_time
FROM (SELECT p.id, p.joining_join
      FROM profile p
      ORDER BY p.joining_time
      LIMIT 100
     ) p INNER JOIN
     profile_subject ps
     ON p.id = ps.profile_id JOIN
     subject s
     ON ps.subject_id = s.id
ORDER BY p.joining_time
LIMIT 20;

关于mysql - order by 和 unique 对性能有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28987605/

相关文章:

php - 创建 PHP 页面的自定义响应

MySql 按日期过滤复杂查询

MySql - 如何获取每个导演的最新电影

android - 将 Activity 实例传递给类是否可以?

c# - Wpf 数据虚拟化

mysql - 如何通过多个 JOIN 提高查询性能

MySQL:如何根据自增ID查找用户插入的最新数据

php - PDO_mysql 不适用于doctrine2 和MAMP

php - 插入新行,更新旧行 : how?

sql - 错误使用 XML 数据类型方法 'modify'。在此上下文中需要使用非增变器方法