我有 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/