序文クエリの最適化は一夜にして達成できるものではありません。対応するツールの使い方を学び、他の人の経験から SQL を最適化し、自分自身を改善する必要があります。 まず、インデックスの利点をまとめましょう。高速なデータ取得、安定したクエリ、サーバーが一時テーブルを作成することを回避するための順次ストレージ、ランダム I/O を順序付けられた I/O に変換することなどです。 ただし、インデックスが標準化された方法で作成されていない場合、余分なスペースが占有され、メモリが浪費され、データの追加、削除、変更のパフォーマンスが低下するという問題が発生します。 したがって、効率的なインデックスは、インデックス データ構造を理解することによってのみ作成できます。
1. インデックス仕様を作成するインデックスの最適化を学習する前に、Alibaba 開発マニュアルに記載されているインデックス作成の仕様をある程度理解しておく必要があります。 主キーインデックス: pk_column_column ユニークインデックス: uk_column_column 共通インデックス: idx_column_column 2. インデックス失敗の理由インデックスを作成するときは、どのような状況でインデックスが失敗するかを知っておく必要があります。インデックスが失敗する理由を理解することによってのみ、インデックス作成時に既知のエラーを回避することができます。 1. リーダーは死なない この古典的なステートメントは、インデックスを作成するときに、左端の原則に従う必要があるという事実を説明しています。 たとえば、テーブル構造は クエリ条件には u_name 列を含める必要があります。 2. インデックス列に対して操作を行わない インデックス列に対して計算、関数、自動または手動の型変換を実行しないでください。そうしないと、テーブル全体のスキャンが実行されます。つまり、インデックス列に対しては操作を行わないでください。 3. 両側のタイプは同じではありません たとえば、インデックスidx_user_nameが作成され、名前フィールドの型はvarcharです。 クエリを実行するときは、 正しい使用法は 4. 不適切なlikeクエリはインデックスエラーを引き起こす可能性がある idx_user_nameというインデックスを作成する 実行文は 実行ステートメントは 実行ステートメントは 5. 範囲条件の後のインデックスは無効になります idx_user_name_age_sexというインデックスを作成します ステートメント 上記の SQL ステートメントは、名前と年齢のインデックスのみにヒットし、性別のインデックスは無効になります。 複合インデックスが失敗した場合は、key_len の長さを確認するだけで済みます。 概要: % インデックスは後でコマンドされます。カバーリング インデックスを使用すると、どのクエリ メソッドでもインデックスにヒットできます。 上記は、インデックスが失敗する理由についての Kaka のまとめです。多くの記事では MySQL のバージョンが明記されていないため、null またはインデックスが失敗する可能性があるという結論が表示されることがあります。 3. SQL最適化のキラー機能を説明するSQL ステートメントを記述した後、必ず実行する必要があることの 1 つは、Explain を使用して SQL ステートメントをチェックし、インデックスにヒットするかどうかを確認することです。 次の図は、explain を使用した出力形式を示しています。出力形式については、以下で簡単に説明します。 1. id 列はクエリ ID です。クエリ ステートメントにサブクエリまたは結合クエリがない場合、この ID は常に 1 になります。 サブクエリまたはユニオンクエリがある場合、この番号は増加します。 2.選択タイプ 最も一般的なタイプは SIMPLE と PRIMARY であり、これらの列のみを知っておく必要があります。 3.表 テーブル名として理解するだけです 4. **タイプ この列は、SQL ステートメントを最適化するときに注意を払うべき最も重要な列の 1 つです。この列には、クエリが使用するタイプが表示されます。 以下は、最良から最悪の順にランク付けされています。
5.可能なキー この列には、使用できる可能性のあるインデックスが表示されます。 6. **キー オプティマイザがpossible_keysからヒットしたインデックス 7.キーの長さ クエリに使用されるインデックスの長さ (バイト数)。key_len は、where 条件で使用されるインデックスの長さのみを計算します。インデックスがソートやグループ化に使用されている場合でも、key_len では計算されません。 8.参照 定数等値クエリを使用している場合は、ここに const が表示されます。 結合クエリの場合、駆動テーブルの実行プランには、駆動テーブルの関連フィールドが表示されます。 条件で式または関数が使用されている場合、または条件列で内部の暗黙的な変換が発生した場合は、func として表示される場合があります。 9. **行 これは、スキャンする必要がある行数の MySQL の推定値です (正確な値ではありません)。 この値は SQL の効率を直接示します。原則として、行数が少ないほど効率が高くなります。 10.フィルタリング この列は、ストレージ エンジンによって返されたデータがサーバー レベルでフィルター処理された後に、クエリを満たすレコードの数の割合を示します。これはパーセンテージであり、特定のレコード数ではないことに注意してください。 11. **追加 ほとんどの場合、次のような状況が発生します。
12. まとめ 上記は Explain のすべての列の説明です。通常の開発プロセスでは、通常、タイプ、キー、行、および追加の列のみに注意を払います。
4. SQL最適化のキラー:遅いクエリ前述のように、explain を直接使用して、SQL ステートメントが妥当かどうかを分析できます。次に、遅いクエリについて説明します。 スロークエリがオンになっているかどうかを確認する インデックスを使用しないSQL文がログに記録されているかどうかを確認する 低速クエリを有効にし、インデックスを使用しないSQL文を記録する グローバル log_queries_not_using_idnexes='on' を設定します。 グローバル log_queries_not_using_indexes='on' を設定します。 上記の2つの設定がオンになっているかどうかを確認します 自分で制御できる低速クエリ時間を設定します。通常は 1 秒で十分です。set 時刻が変更されていない場合は、クライアントを再接続するだけです。 低速クエリの保存場所を表示する 次に、インデックスを実行しないステートメントを実行すると、このログにこのステートメントが表示されます。 上の図では、主にQuery_timeとSQL文の内容に注目します。 上記は、スロークエリを使用してプロジェクト内で問題のある SQL ステートメントを表示する方法についてです。 5. 最適化手法ここでは、よく使用される SQL ステートメントの最適化ソリューションについて説明します。上記の 2 つのツールは、モンスターと戦うためにうまく活用する必要があります。
VI. 結論これで、MySQL クエリ最適化の必須知識ポイントに関するこの記事は終了です。MySQL クエリ最適化に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: docker ログ - docker コンテナ ログの実装を表示します
目次序文コンセプト安定意味使用シナリオコードVueでの使用スロットリング意味使用シナリオコードVue...
目次1. プロパティを型リストに制限する2. デフォルトのコンテンツと拡張ポイント3. ネストされた...
この記事では、主に CSS3 フレックス エラスティック ボックスの自動塗りつぶしの書き方について詳...
DockerでGit環境を構成する仕事上、Docker 環境で GitLab リポジトリを操作する必...
この記事では、マーキースタイルのテキストの水平スクロールを実現するためのVueの具体的なコードを参考...
目次1. 外部キー制約外部キーとは何ですか?外部キーを使用する条件:外部キーの定義構文は次のとおりで...
目次1. ダウンロード2. 展開3. Nginxログ関連の設定4. ファイルダウンローダーとして n...
目次MySQL ベースの検索エンジンの実装1. ngram全文パーサー2. 全文インデックスを作成す...
問題を見つける最近、仕事で問題が発生しました。MySQL データベースにテーブルを作成するときに、ラ...
エラー メッセージ:ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響を与...
質問: int(1) と tinyint(1) の違いは何ですか?このような設計では、いずれにしても...
1. 建設1. htpasswd.txtファイルを準備するファイルには、パッケージを倉庫にアップロー...
この記事では、シンプルなショッピングカートを実装するためのJavaScriptの具体的なコードを参考...
問題の説明:最近、rsyncで毎回同期するデータ量が多いが、データベースのbakファイルを保持する必...
IPマスカレードとポート転送Firewalldは2種類のネットワークアドレス変換をサポートしています...