EXPLAIN ステートメントは、MySQL クエリ ステートメント プロセスと EXPLAIN ステートメントの基本概念および最適化で紹介されており、遅いクエリの例が示されています。 上記のクエリでは、10,000 件を超えるレコードをチェックする必要があり、一時テーブルとファイルソートを使用していることがわかります。このようなクエリは、ユーザー数が急増すると悪夢になります。 このステートメントを最適化する前に、まず SQL クエリの基本的な実行プロセスを理解しましょう。 1. アプリケーションはMySQL APIを介してMySQLサーバーにクエリコマンドを送信し、それが解析されます。 2. 権限を確認し、MySQL オプティマイザーで最適化します。解析と最適化の後、クエリ コマンドは CPU で実行でき、キャッシュできるバイナリ クエリ プランにコンパイルされます。 3. インデックスがある場合は、まずインデックスをスキャンします。データがインデックスでカバーされている場合は、追加の検索は必要ありません。そうでない場合は、インデックスに基づいて対応するレコードを見つけて読み取ります。 4. 関連するクエリがある場合、クエリの順序は、最初のテーブルをスキャンして条件を満たすレコードを見つけ、次に2番目のテーブルをスキャンして、最初のテーブルと2番目のテーブルの関連するキー値に従って条件を満たすレコードを見つけ、この順序でループします。 5. クエリ結果を出力し、バイナリログを記録する 当然のことながら、適切なインデックスを使用すると、検索が大幅に簡素化され、高速化されます。上記のクエリ ステートメントを見てみましょう。条件付きクエリに加えて、関連クエリと ORDER BY (並べ替え操作) もあります。 それでは、結合と ORDER BY がどのように機能するかを詳しく見てみましょう。MySQL には、結合とデータの並べ替えを処理する 3 つの方法があります。 最初の方法はインデックスに基づき、2 番目は最初の非定数テーブルをファイルソート (クイックソート) し、3 番目は結合クエリの結果を一時テーブルに入れてからファイルソートを実行する方法です。 注 1: 定数テーブルの詳細については、『MySQL 開発者マニュアル: Consts and Constant Tables』を参照してください。 最初の方法は、ORDER BY が依存する列のインデックスが最初の非定数テーブルに存在する場合に使用されます。この場合、すでに順序付けされたインデックスを直接使用して、関連付けられたテーブルのデータを見つけることができます。この方法は、追加の並べ替えアクションが不要なため、最高のパフォーマンスを発揮します。 2 番目の方法は、ORDER BY が依存するすべての列が最初のクエリ テーブルに属し、インデックスがない場合に使用されます。この場合、最初に最初のテーブルのレコードに対してファイルソートを実行し (モードはモード 1 またはモード 2 のいずれか)、順序付けされた行インデックスを取得してから、関連するクエリを実行します。ファイルソートの結果は、システム変数 sort_buffer_size (通常は約 2M) に応じて、メモリ内またはハード ディスク上に存在する場合があります。 3 番目の方法は、ORDER BY の要素が最初のテーブルに属していない場合に使用されます。関連付けられているクエリの結果を一時テーブルに格納し、一時テーブルでファイルソートを実行する必要があります。 3 番目の方法の一時テーブルは、メモリ内テーブルまたはハードディスク上にある場合があります。通常、ハードディスク (ディスク上のテーブル) は次の 2 つの状況で使用されます。 (1)BLOBとTEXTデータ型の使用 (2)メモリテーブルの占有量がシステム変数tmp_table_size/max_heap_table_sizeの制限(通常16M程度)を超えているため、ハードディスク上にしか配置できない。 上記のクエリ実行プロセスと方法から、filesortの使用とtemporaryの使用がクエリのパフォーマンスに重大な影響を与える理由を明確に理解できるはずです。データ型やフィールド設計に問題がある場合、 クエリ対象のテーブルと結果に大きなデータ フィールドがあり、適切なインデックスが利用できない場合は、大量の IO 操作が生成される可能性があります。これがクエリ パフォーマンスの低下の根本的な原因です。 記事の冒頭のクエリ例に戻ると、明らかに最も効率の悪い 3 番目の方法が使用されています。実行して試す必要がある最適化方法は次のとおりです。 1. users.fl_noのインデックスを追加し、selectとwhereで使用されるフィールドのインデックスを作成します。 2. users.fl_noをuser_profileテーブルに転送するか、冗長フィールドとして追加します。 3. TEXT タイプのフィールドを削除します。TEXT は、中国語の場合は VARCHAR (65535) または VARCHAR (20000) に置き換えることができます。 4. filesort の使用を排除できない場合は、sort_buffer_size を増やして IO 操作の負荷を軽減します。 5. 最初のテーブルでカバーされているインデックスを使用してソートを試みます。それでもうまくいかない場合は、ソート ロジックを MySQL から PHP/Java プログラムに移動して実行します。 最適化方法 1、2、3 を実装した後、EXPLAIN の結果は次のようになります。 注: 簡単な PHP アプリケーションを作成し、Siege を使用してテストすると、クエリの効率が 3 倍以上向上します。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Linux で Multitail コマンドを使用するチュートリアル
>>: JavaScript 文字列操作の 4 つの実用的なヒント
目次1.関数内のこの方向1. 通常の機能2. コンストラクター3. オブジェクトメソッド4. イベン...
IE は開発の初期段階では頭を悩ませましたが、他のブラウザとは異なります。他のブラウザがサポートして...
序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...
目次1. nginxのインストールと操作(Mac OS環境) 2. nginxルールの設定3. コマ...
MySQL バックアップコールドバックアップ:停止服務進行備份,即停止數據庫的寫入ホットバックアップ...
目次複雑なクエリとステップバイステップのクエリクエリステートメントを分割する共同クエリの分解問題のあ...
目次1. 遅いところはどこですか? 2. 不要なデータをクエリしましたか? 1. 不要なレコードをク...
目次Nginx 負荷分散構成Nginx 負荷分散戦略ポーリング(デフォルト)重さip_ハッシュ公正(...
序文しばらく前にMysqlのデッドロック問題に遭遇したので、解決しました。問題の説明: Mysql ...
目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...
MySQL 5.7.21 解凍版のインストールと設定方法は参考までに。具体的な内容は以下のとおりで...
背景多くのウェブサイトのデザインは、一般的にコンテンツ+フッターの2つの部分で構成されています。コン...
背景要件: ERP システムに「ボタン権限制御」機能を追加する必要があり、権限の制御粒度をボタン レ...
多くの人が Linux Homebrew を使用しています。これをより良く使用するための 3 つのヒ...
以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<!DO...