具有明显的排序会对性能产生影响

时间:2015-03-11 13:14:51

标签: mysql sql performance

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

我的查询如下,

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秒 但是没有顺序条款,它只需要0.11秒

如何使用所需结果改进此查询?

1 个答案:

答案 0 :(得分:1)

我最简单的建议是在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是必要的。在结构良好的数据库中,subject_id中的profile_subject值不在subject中。所以,试试这个:

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;
相关问题