我有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秒
如何使用所需结果改进此查询?
答案 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;