我有一个系统和报表模型。系统has_many报告和报告belongs_to系统。每份日报包含每个系统175条记录。索引查询优化页面
我需要在我的系统#索引页面上查询,该页面应列出在最新报告创建时过滤的所有系统。这是我第一次尝试。
@systems = System.joins('LEFT JOIN reports ON reports.system_id = systems.id').group('systems.id').order('MAX(reports.created_at) ASC')
此列出系统的报告(系统负载(2.1ms)),但是SYSTEM_ID排序不报告created_at。
第二次尝试
@systems = System.joins(:reports).where("reports.created_at = (SELECT MAX(created_at) FROM reports p group by system_id having p.system_id = reports.system_id)").order('reports.created_at DESC')
这个查询做工作,但实在是太慢了(系统负载(546.2ms)),尽管有上report.created_at的索引。
第三次尝试
@systems = System.joins(:reports).where("reports.id = (SELECT MAX(id) FROM reports p group by system_id having p.system_id = reports.system_id)").order('reports.id DESC')
也做了工作,略高于第二次尝试(系统负载(468.3ms))快,但仍然不够快。
任何提示?
编辑03032017
我做了一个小的测试数据集
旧的查询
SELECT s.* FROM systems s
JOIN reports r ON r.system_id = s.id
WHERE r.created_at = (
SELECT MAX(created_at)
FROM reports p
group by p.system_id
having p.system_id = r.system_id)
ORDER BY r.id DESC
Time: 622.683 ms
菲利普·库寿龄解决方案的数字(干净的,仅返回与报告系统)
SELECT systems.*
FROM systems
JOIN (
SELECT reports.system_id
, MAX(reports.created_at) created
FROM reports
GROUP BY reports.system_id
) AS r_date ON systems.id = r_date.system_id
ORDER BY r_date.created;
Time: 1.434 ms
BookofGr如解决方案(将给我所有的系统,报告或没有报告)
select systems.* from systems order by updated_at;
Time: 0.253 ms
我无法得到systemjack的解决方案的工作。
最快的解决方案:bookofgreg
干净的解决方案:菲利普·库寿龄
感谢您的输入。
对此回复非常满意,感谢您的解释。明天会试试看。 –