我有一個系統和報表模型。系統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
乾淨的解決方案:菲利普·庫壽齡
感謝您的輸入。
對此回覆非常滿意,感謝您的解釋。明天會試試看。 –