元の問題:
クエリ
select * from records where id in ( select max(id) from records group by option_id )
レコード テーブル全体の順次スキャンを実行して、各レコードの最大 ID を決定します。オプションID。このアプローチは、特に大きなテーブルの場合、非効率的です。
1 つの解決策は、水平結合を利用して、サブクエリ内の各 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 を持つ行のみがフィルターされます。
もう 1 つの最適化は、レコード テーブルに特殊なインデックスを作成して、各 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 中国語 Web サイトの他の関連記事を参照してください。