原始問題:
查詢
select * from records where id in ( select max(id) from records group by option_id )
對整個記錄表執行順序掃描以決定每個option_id 的最大ID。這種方法效率低下,尤其是對於大型表。
一種解決方案是利用橫向聯接來獲取子查詢中每個option_id 的最大ID:
select r.* from records r cross join lateral ( select max(id) as max_id from records where option_id = r.option_id ) m where r.id = m.max_id
此查詢使用橫向聯接來計算單獨子查詢中的最大ID。結果與原始記錄表連接,僅過濾具有最大 ID 的行。
另一個最佳化是在記錄表上建立專用索引,用於儲存每個option_id 的最大ID:
CREATE INDEX idx_max_id ON records (option_id, max(id))
此索引可以直接找出給定option_id 的最大ID,從而無需原始索引子查詢:
select * from records r where (option_id, id) in ( select option_id, max(id) from records group by option_id )
基於索引的方式顯著減少了表的訪問次數,使得對於大表的查詢更加高效。
以上是如何最佳化查詢以有效地找到分組最大值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!