ホームページ > データベース > mysql チュートリアル > MySQL および PostgreSQL でグループごとの最大クエリを最適化するにはどうすればよいですか?

MySQL および PostgreSQL でグループごとの最大クエリを最適化するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-01 09:58:10
オリジナル
277 人が閲覧しました

How Can I Optimize Groupwise Maximum Queries in MySQL and PostgreSQL?

グループごとの最大クエリの最適化

option_id でグループ化された最大 ID を持つレコードを取得することを目的とした提供されたクエリは、すべてをスキャンするためパフォーマンスの問題に直面しています。行。これに対処するには、option_id ごとに最大 ID 値を格納するプログラム インデックスの利用を検討してください。このアプローチにより、インデックスをスキャンするだけで最大値を効率的に取得できます。

インデックス付け (option_id, id) や (option_id, id DESC) などの従来のアプローチでは、クエリが適切に最適化されません。

MySQL の最適化

MySQL 5.5このクエリには高度な最適化が組み込まれています。 (option_id, id) のインデックスを作成することで、MySQL は group-by 操作のインデックスを活用し、順次スキャンの必要性を回避します。

参照テーブルによる Postgres の最適化

Postgres 内、レコード内の個別の option_id に対応する一意の option_id を使用して、参照テーブル options を作成します。 table.

CREATE TABLE options ( option_id INT PRIMARY KEY, option TEXT UNIQUE NOT NULL );

INSERT INTO options SELECT DISTINCT option_id, 'option' || option_id FROM records;
ログイン後にコピー

相関サブクエリを使用して、option_id ごとにレコードから最大 ID を取得します。

SELECT option_id, (SELECT MAX(id) FROM records WHERE option_id = o.option_id) AS max_id
FROM options o
ORDER BY 1;
ログイン後にコピー

このアプローチにより、インデックスのみのスキャンが有効になり、レコード内の行アクセスが最小限に抑えられます。このクエリの理想的なインデックス:

CREATE INDEX ON records (option_id, id DESC NULLS LAST);
ログイン後にコピー

LATERAL 結合を使用した Postgres の最適化 (Postgres 9.3 )

あるいは、Postgres 9.3 以降では、LATERAL 結合を使用して、同様のことを達成する最適化:

SELECT *
FROM records
LATERAL (
  SELECT MAX(id) OVER (PARTITION BY option_id) AS max_id
  FROM records
) AS m
WHERE records.id = m.max_id;
ログイン後にコピー

このアプローチでは、効率的なクエリ実行のためにインデックスのみのスキャンも利用します。

以上がMySQL および PostgreSQL でグループごとの最大クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート