個別の行をカウントするための結合の最適化
複数の結合を実行して個別の行をカウントする場合、不要な操作を避けるためにクエリを最適化することが重要です。重大なパフォーマンスの問題につながる可能性がある間違いの 1 つは、必要以上に多くのテーブルを結合することです。結合ごとにコストが指数関数的に増加するためです。
すべてのテーブルを結合する代わりに、より効率的なアプローチは、それぞれに含まれる複数のサブクエリを実行することです。単一の結合。これにより、各テーブルのカウントを分離し、不必要な乗算を回避できます。
サブクエリを使用した最適化されたクエリの例を次に示します。
SELECT Titre, (SELECT COUNT(DISTINCT idPays) FROM pays_album WHERE idAlb IN (SELECT idAlb FROM album WHERE titreAlb = "LES CIGARES DU PHARAON")) AS Pays, (SELECT COUNT(DISTINCT idPers) FROM pers_album WHERE idAlb IN (SELECT idAlb FROM album WHERE titreAlb = "LES CIGARES DU PHARAON")) AS Personnages, (SELECT COUNT(DISTINCT idJur) FROM juron_album WHERE idAlb IN (SELECT idAlb FROM album WHERE titreAlb = "LES CIGARES DU PHARAON")) AS Jurons FROM album WHERE titreAlb = "LES CIGARES DU PHARAON"
このクエリにより、各サブクエリは必要なクエリのみを結合します。テーブルを使用して、全体的な運用コストを削減します。複数のサブクエリを使用すると、すべてのテーブルを結合することなく複数のカウントを効果的に実行できます。
テーブルに一意のキーがあり、idAlb がアルバムの一意のキーであると仮定します。その場合、DISTINCT を使用した単一の結合を使用して、次のクエリで行をカウントすることもできます。
SELECT alb.titreAlb AS Titre, COUNT(DISTINCT payalb.idAlb) AS Pays, COUNT(DISTINCT peralb.idAlb) AS Personnages, COUNT(DISTINCT juralb.idAlb) AS 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 は結合によって生じた重複を削除し、個別の行をカウントできるようにします。正しく行を並べます。ただし、この方法でもすべてのテーブルを結合する必要があるため、常に最も効率的なソリューションであるとは限りません。
結合プロセスを最適化することで、計算コストを最小限に抑え、特にクエリのパフォーマンスを向上させることができます。大規模なデータセット。特定のデータとスキーマを評価して、最適な最適化戦略を決定することを忘れないでください。
以上がSQL で個別の行をカウントするために結合を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。