インデックスを使用できない場合、MySQL には、グループ化を実行するために一時テーブルまたはファイルソートを使用するという 2 つの GROUP BY クエリ戦略があります。特定のクエリに対して、どちらのアプローチもより効率的になることはありません。 SQL_BIG_RESULT と SQL_SMALL_RESULT を構成して、オプティマイザーがこれらの方法のいずれかを選択するように指定できます。 通常、クエリ テーブルを値ではなく ID でグループ化する方が効率的です。たとえば、次のクエリは非効率的です。 俳優.first_name、俳優.last_name、COUNT(*) を選択 sakila.file_actor から INNER JOIN sakila.actor USING(actor_id) GROUP BY actor.first_name、actor.last_name; 次のクエリの方が効率的です。 俳優.first_name、俳優.last_name、COUNT(*) を選択 sakila.file_actor から INNER JOIN sakila.actor USING(actor_id) film_actor.actor_id でグループ化します。 グループ化には、film_actor.actor_id を使用するよりも actor.actor_id を使用する方が効率的です。 このクエリは、俳優の名前が actor_id に依存しているため、同じ結果を返すという利点がありますが、結果が異なる場合は同じ結果が返されません。場合によっては、サーバーが SQL_MODE 構成を介して GROUP BY を無効にすることもあります。現時点で取得された値を気にせず、グループ化に使用する列の値が一意である場合は、MIN と MAX を使用してこの問題を解決できます。 MIN(俳優.first_name)、MAX(俳優.last_name)、...を選択します。 完璧主義者は、あなたのグループ分けが間違っていて、自分たちが正しいと考えるでしょう。ダミーの MIN または MAX を使用すると、クエリが正しく組み立てられなくなります。ただし、MySQL でクエリをより高速に実行したい場合もあります。完璧主義者は次のような質問に満足するでしょう。 俳優.first_name、俳優.last_name、c.cnt を選択 sakila.actorより 内部結合( actor_id、COUNT(*) を cnt として選択します。 sakila.film_actorより 俳優IDでグループ化 ) AS c USING(actor_id); ただし、サブクエリで一時テーブルを作成してデータを入力すると、理論上よりもコストがかかる可能性があります。サブクエリによって構築された一時テーブルにはインデックスがないため、パフォーマンスが低下することに注意することが重要です。 一般的に、グループ化されたクエリでは、グループ化されていない列を選択することはお勧めできません。これは、クエリ結果が不確実であるためです。インデックスが変更されたり、オプティマイザーが異なる戦略を使用したりすると、結果も変わります。実際、サーバーの SQL_MODE を ONLY_FULL_GROUP_BY に設定することをお勧めします。これにより、不適切に記述された group by クエリが記述された場合、システムはそれを直接実行するのではなく、エラーを生成します。 ONLY_FULL_GROUP_BY を有効にすると、SELECT のフィールドは GROUP BY で指定されたフィールドのみになります。この場合、ステップバイステップのクエリまたはサブクエリを作成して、最初にグループ化された列を検索し、次にセカンダリ クエリを実行できます。 MySQL は、ORDER BY を使用してソートルールを指定しない限り、GROUP BY で指定された列の順序に従って自動的にグループ化します。順序を気にせず、これによってファイルソートが発生する場合は、ORDER BY NULL を使用して自動ソートをスキップできます。また、GROUP BY の後に DESC または ASC を追加することで、結果を指定した方向に並べ替えるように指定することもできます。 場合によっては、クエリをグループ化するときに、結果でスーパー集計を実行するように MySQL に要求できます。これは、GROUP BY の後に WITH ROLLUP 句を追加することで実行できますが、目的の最適化が達成されない可能性があります。 EXPLAIN を通じて実行方法を確認し、グループ化がファイルソートまたは一時テーブルを通じて行われているかどうかに注意することができます。次に、WITH ROLLUP を削除した後、同じクエリを比較します。比較することで、最適化する方法が見つかるかもしれません。 この方法ではより多くの行が返されますが、集計クエリを追加する方が効率的な場合もあります。 FROM の後にサブクエリをネストして中間クエリ結果を保持し、UNION を使用して最終結果を取得することもできます。 ただし、アプリケーションから WITH ROLLUP を削除し、最適化を通じてグループ化されたクエリを実行するのが最善であることに注意してください。
以上がMySQLグループクエリの最適化方法の詳細です。MySQLグループクエリの最適化の詳細については、123WORDPRESS.COMの他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
<<: HTML CSS に基づく検索アイコン付き検索ボックス機能を実装する
>>: Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル
IE には長い間問題がありました。誰もがテストを受けたとき、誰もが笑顔でしたが、それはただのニヤニヤ...
今日は、CSS を使用して左上の三角形を記述するいくつかの方法を紹介します。概略図(幅と高さを60p...
序文これまでは、パイプワークで割り当てた静的 IP は一時的なものであり、再起動すると無効になってい...
MySQL 自体はファイルシステムに基づいて開発されましたが、ロックの存在が異なります。データベース...
MySQL レプリケーション テーブルの詳細な説明テーブル構造、インデックス、デフォルト値などを含む...
JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する...
目次1. はじめに2. 製品テーブルを準備する2.1 ステートメントの順序2.2 大文字と小文字の区...
目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...
1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...
目次質問:プロジェクトには 2 つのトークンがあり、1 つは有効期間が 2 時間 (ショート トーク...
WIN10 64ビットに最新のMySQL8.0.18をインストールダウンロード公式サイトから最新バ...
この記事では、:placeholder-shown 疑似クラスを使用して、純粋な CSS で浮動疑問...
この記事の例では、グラフィック検証コードを実装するためのVueの具体的なコードを参考までに共有してい...
1. 設置環境Windows7 で MySQL5.6 データベースの解凍バージョンをアンインストー...
01. コマンドの概要Linux には充実したヘルプ マニュアルが用意されています。コマンドのパラメ...