ホームページ >データベース >mysql チュートリアル >複数のデータベース結合からの結果を効率的にカウントするにはどうすればよいですか?

複数のデータベース結合からの結果を効率的にカウントするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-08 16:11:10203ブラウズ

How to Efficiently Count Results from Multiple Database Joins?

最適な効率で複数の結合からカウントを取得する方法

データベース クエリでは、結合の数を最小限に抑えることがパフォーマンスにとって重要です。ただし、複数のカウントを取得するために一度に複数の結合を実行したくなるシナリオもあるでしょう。例を検討し、最適化戦略について説明します。

問題ステートメント

タスクは、同じ主キーに対する複数の結合によって返される行をカウントすることです。単純なアプローチには、結合ごとに個別のサブクエリを作成することが含まれます。ただし、次のような疑問が生じます: 単一のクエリを使用して同じ結果を達成するより効率的な方法はありますか?

初期試行

1 つのアプローチは、以下に示すように、case ステートメントを使用した複数の結合の結果:

select alb.titreAlb as "Titre",
sum(case when alb.idAlb=payalb.idAlb then 1 else 0 end) "Pays",
sum(case when alb.idAlb=peralb.idAlb then 1 else 0 end) "Personnages",
sum(case when alb.idAlb=juralb.idAlb then 1 else 0 end) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb

ただし、このメソッドは結合されたすべての行の合計数をカウントします。

最適化ソリューション

クエリを最適化し、結合ごとに個別のカウントを取得するには、単一のクエリで DISTINCT を利用します。関連するテーブルごとに一意のキーが必要であり、idalb 列はアルバム テーブルの一意のキーである必要があります。修正されたクエリは次のとおりです。

select alb.titreAlb as "Titre",
count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb

このクエリでは、distinct はカウントに対する他の結合の影響を削除します。ただし、distinct によって必ずしも結合のコストが削減されるわけではないことに注意してください。テーブルのすべての (idAlb PrimaryKeyFields) フィールドでカバー インデックスが利用できる場合、このアプローチにより、各結合が個別に実行された元のソリューションと同等の速度が得られる可能性があります。それにもかかわらず、EXPLAIN を使用してテストすることは、最適な戦略を決定するのに役立ちます。

以上が複数のデータベース結合からの結果を効率的にカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。