MySQLグループクエリの最適化方法


MySQLはGROUT BYとDISTINCTクエリを処理する方式がほとんどの場合似ていますが、実際には最適化の過程では、この2つの方法で変換されることがあります。二つの種類のクエリーはいずれも索引から利益を得ることができます。通常、この二つのクエリを最適化する最も重要な方法です。
インデックスが使えない場合、MySQLはGROUT BYクエリに対して2つのポリシーがあります。一時テーブルまたはfilesortを使ってパケットを実行します。与えられたクエリに対しては、両方の方法がより効率的ではない。SQL_を配置することによりBIG_RESULTとSQL_SMALLRESULTは、最適化器が選択する方法を指定している。
通常、クエリーテーブルのIDをパケット化することは、使用値よりもパケット効率が高く、例えば以下のクエリ効率が低い。

SELECT actor.first_name, actor.last_name, COUNT(*)
FROM sakila.file_actor
INNER JOIN sakila.actor USING(actor_id)
GROUP BY actor.first_name, actor.last_name;
以下のクエリーの方が効果的です。

SELECT actor.first_name, actor.last_name, COUNT(*)
FROM sakila.file_actor
INNER JOIN sakila.actor USING(actor_id)
GROUP BY film_actor.actor_id;
actor.actorを使っています。idでグループ分けするとfilm_に比べます。actor.actoridの方がより効率的です。
このアンケートが強みを発揮しているのは、俳優の名前はactorに依存しているということです。idの場合は、同じ結果に戻りますが、返ってくる結果が違ったら、このようにはできません。時にはSQL_を経由して仕事をすることもあります。MODE設定はGROUTP BYを無効にしました。このとき、取得した値に関心がなく、パケットの列の値が唯一である場合、MINとMAXを用いてこの問題を解決することができる。

SELECT MIN(actor.first_name), MAX(actor.last_name), ...;
完璧主義者に対しては、あなたのグループは間違っていると思います。彼らも正しいです。仮想MINまたはMAXの結果、クエリは正確に組み立てられない。しかし、場合によっては、MySQLがより速くクエリーを実行するためだけに。完璧主義者は次の調査に満足します。

SELECT actor.fisrt_name, actor.last_name, c.cnt
FROM sakila.actor
	INNER JOIN (
    SELECT actor_id, COUNT(*) AS cnt
    FROM sakila.film_actor
    GROUP BY actor_id
  ) AS c USING(actor_id);
しかし、サブクエリーで作成されたものと充填されたものの価格は、理論的に見たものよりも高いかもしれない。覚えておきたいのは、サブクエリーで構築された一時テーブルにはインデックスがなく、性能が低下することです。
グループクエリでは、通常、グループ化されていない列を選択することが悪いアイデアです。これは照会結果が不確実であり、インデックスまたは最適化器が異なる戦略を使用すると結果が変化するからである。実は、業務上のSQL_を提案します。MODEはONLY_に設定されていますFULL_GROUT_BYの場合、悪いグループクエリを書いた場合、システムは直接実行するのではなくエラーを発生します。ONLYを開くFULL_GROUT_BY後、SELECTのフィールドはGROUT BYで指定されたフィールドのみとなり、ステップ別のクエリーまたはサブクエリを構築することにより、先にグループを分けてグループの列を調べ、再度のクエリーを行うことができます。
MySQLは、ORDER BYを使用してソート規則を指定しない限り、GROUT BYで指定された列順に自動的にグループ化されます。順序を気にせずに発見された場合には、ORDER BY NULLを使用して自動並べ替えをスキップすることができます。GROUTP BYの後にDESCまたはASCを追加して結果を指定の方向に並べ替えることもできます。
パケットクエリの際に、MySQLが結果にスーパー重合をするように要求されることがある。これは、GROUT BYの後にWITH ROLLUP子文を追加することにより完成できますが、これは必ずしも最適化の期待を達成することができるとは限りません。EXPLANは、グループがfilesortまたは仮テーブルを通じて完了しているかどうかの確認を行うことができます。そして同じクエリをWITH ROLLUPから除去して比較します。比較によって最適化の方法が見つかるかもしれません。
集約クエリを増やすことによって、より効率的になる場合がありますが、この方法はより多くの行に戻ります。FROMの後にサブクエリを埋め込んで中間クエリの結果を保持し、UNIONを使って最終結果を取得することもできます。
ただし、アプリケーションではWITH ROLLUPを除去し、最適化によりグループクエリを完了することが望ましい。
結語:GROUTP BYを用いてグループクエリを行う場合は、インデックス列パケットを使用することが望ましい。指定された順序なしにORDER BY NULLを使用して最適化することができる。索引の列によってグループ化しない場合は、別の方法を考慮し、サブクエリを使ったり、WITH ROLLUPを使って性能を調べたりして最適化する必要があります。また、グループクエリに予期せぬエラーが発生しないようにONLY_を開いておくと良いです。FULL_GROUT_BY
以上がMySQLグループクエリの最適化方法の詳細です。MySQLグループクエリの最適化に関する資料は他の関連記事に注目してください。