ホームページ  >  記事  >  データベース  >  MySQL は特定の種類のクエリを最適化します (コード例)

MySQL は特定の種類のクエリを最適化します (コード例)

不言
不言転載
2019-01-17 10:39:543398ブラウズ

この記事は、特定の種類のクエリの最適化に関する MySQL に関するものです (コード例)。必要な方は参考にしていただければ幸いです。

関連付けられたクエリの最適化

関連付けを使用するクエリを最適化する場合は、次の点に特別な注意を払う必要があります。

1. ON または USING 句内の列にインデックスがあることを確認してください。インデックスを作成するときは、関連付けの順序を考慮する必要があります。テーブル A とテーブル B が列 c を使用して関連付けられている場合、オプティマイザの関連付け順序が B、A であれば、テーブル B の対応する列にインデックスを構築する必要はありません。他の理由がない限り、関連付けシーケンスの 2 番目のテーブルの対応する列にインデックスを作成するだけで済みます。未使用のインデックスは負担が増えるだけです。

2. MySQL がインデックスを使用してこのプロセスを最適化できるように、GROUP BY および ORDER BY の式には 1 つのテーブルの列のみが含まれるようにしてください。

3. MySQL をアップグレードするときは、関連付けの構文、演算子の優先順位、その他の変更される可能性のある場所に注意する必要があります。

GROUP BY と DISTINCT の最適化

多くのシナリオでは、MySQL はこれら 2 つのクエリを最適化するために同じ方法を使用します。実際、MySQL オプティマイザーは内部で処理します。これら 2 種類のクエリを相互に変換します。これらはすべてインデックスを使用して最適化できます。これは最も効果的な最適化方法でもあります。

インデックスが使用できない場合は、GROUP BY は、一時テーブルを使用するか、グループ化のためのファイルの並べ替えを使用するという 2 つの戦略を使用して実現されます。どのクエリ ステートメントでも、両方の戦略のパフォーマンスを向上させることができます。促すことができます SQL_BIG_RESULT および SQL_SMALL_RESULT を使用して、オプティマイザーを希望どおりに動作させます。

LIMIT ページングの最適化

システムでページング操作を実行する必要がある場合、通常は LIMIT とオフセットのメソッドを使用して実装し、適切な ORDER BY 句を追加します。対応するインデックスがある場合、通常は効率が高くなります。そうでない場合、MySQL は多くのファイル ソート操作を実行する必要があります。

しかし、非常に一般的で厄介な問題は、オフセットが非常に大きい場合、たとえば、LIMIT 10000,20 のようなクエリになる可能性があることです。現時点では、MySQL は 10020 レコードをクエリして、最後の 20 アイテム、価格は非常に高いです。

すべてのページが同じ頻度でアクセスされる場合、そのようなクエリは平均してテーブルのデータの半分にアクセスする必要があります。このようなクエリを最適化するには、ページ内のページ数を制限するか、大きなオフセットのパフォーマンスを最適化します。

このタイプのページング クエリを最適化する最も簡単な方法の 1 つは、すべての列をクエリするのではなく、インデックス カバレッジ スキャンを可能な限り使用することです。次に、必要に応じて相関演算を実行し、最後に必要な列を返します。オフセットが大きい場合、これを行う効率が大幅に向上します。次のクエリを考えてみましょう。

SELECT file_id, description FROM sakila.film
ORDER BY title LIMTI 50, 5;

このテーブルが大きい場合は、このクエリを次のように変更するのが最善です。

SELECT file.file_id, file.description
FROM sakila.film
    INNER JOIN(
        SELECT film_id FROM sakila.film
        ORDER BY title LIMIT 50, 5
    )

ここでの「遅延関連付け」により、クエリの効率が大幅に向上します。 MySQL ができるだけ少ないページをスキャンし、アクセスする必要があるレコードを取得し、関連するカラムに従って元のテーブルのクエリに必要なすべてのカラムを返します。

別の最適化方法があります。これは、アプリケーションを使用して最後のデータの場所を記録し、次のクエリで記録された場所から直接スキャンを開始できるため、OFFSET の使用を回避できます。

このメソッドを使用すると範囲クエリに変換でき、ページをどれだけ遡ってもパフォーマンスが非常に向上します。

以上がMySQL は特定の種類のクエリを最適化します (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。