SQLの最適化では間違いがよく起こります。それはMySQLのExplain Planの使い方を理解していないからです。

SQLの最適化では間違いがよく起こります。それはMySQLのExplain Planの使い方を理解していないからです。

1. 準備

キャラクターテーブル、装備テーブル、基本データテーブルの 3 つのテーブルを用意します。ここではチュートリアルで必要なフィールドのみを示します。ゲーム開発の過程では、これらのフィールド以外にも多くのフィールドが存在するはずです。皆さんも理解していると思います。

役割表:

テーブル `role` を作成します (
  `n_role_id` int デフォルト NULL,
  `s_name` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_bin デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8mb4 COLLATE=utf8mb4_bin;

装備リスト:

テーブル `equip` を作成します (
  `n_equip_id` int デフォルト NULL,
  `s_equip_name` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_bin デフォルト NULL,
  `n_config_id` int デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8mb4 COLLATE=utf8mb4_bin;

機器構成表

テーブル `dict_equip` を作成します (
  `n_equip_id` int デフォルト NULL,
  `s_desc` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_bin デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8mb4 COLLATE=utf8mb4_bin;

2. 説明計画の概要

説明プランを表示するには、次の 2 つの方法があります。

1. コマンド方式: explain sql、または desc sql、どちらのコマンドでも問題ありません。言葉が非常に直接的なので、explain を覚えた方が良いと思います。

2. Navicat ツールを使用します (他のツールについてはよく知りませんが、他にもいくつかあると思います)。クエリ ウィンドウで [Explain] をクリックします。キーワード explain を追加する必要はありません。

結果には多くの列が含まれており、その一部は null で、一部は値を持っていることがわかります。説明プランを理解していれば、SQL をターゲットに合わせて最適化できます。

3. フィールドの詳細な説明

説明プランには非常に多くのフィールドがあります。Navicat は 12 個のフィールドを表示します。そのうちのいくつかには特別な注意を払う必要があり、それらのいくつかで何が起こっているかを知るだけでも良いでしょう。

公式ドキュメントの説明: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

1. id実行の順序

id は select の実行順序です。id が大きいほど優先度が高くなり、先に実行されます。id が同じ場合は、次のものが先に実行されます

その理由は、サブクエリを実行するときに、最初に内部レイヤーがチェックされ、次に外部レイヤーがチェックされるためです。

選択
    de.*
から
    dict_equip で
どこ
    de.n_equip_id = (
        SELECT n_equip_id FROM equip e WHERE
            e.n_role_id = (
                SELECT n_role_id FROM role r WHERE r.s_name = 'Coriander' )
    ) 

上記の実行プランから、最初に role テーブルのクエリが実行され、次に equip が実行され、最後に dict_equip が実行されることがわかります。

2. select_type 選択タイプ

3. テーブルクエリにはテーブルまたは派生テーブルが含まれます

現在出力に使用されているテーブルの種類は次のとおりです。

<union M , N > : 行データは結合後のデータです。IDはmからnの間です。

<derived*N*>: 派生テーブル

<サブクエリN >: サブクエリ

4. パーティションクエリにはパーティションが含まれます

パーティションテーブルを使用する場合にのみ使用できます。この高度な機能はまだ使用されていません。

5. クエリの種類

MySQL がテーブル内の必要な行を見つける方法を示します。これは「アクセス タイプ」とも呼ばれます。一般的なタイプは次のとおりです。

パフォーマンス: all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

左から右へ、最悪から最高へ

最適化時に、クエリされるデータの量が多い場合は、フルテーブルスキャンを使用してインデックスの使用を回避できます。

少量のデータのみをクエリする場合は、インデックスを使用してみてください。

6. possible_keys: 使用されると予想されるインデックス

他のテーブルに関連付けられていない場合、クエリテーブルは使用できるインデックスです。

7. キー: 実際のクエリ処理で使用されるインデックス

クエリでMySQLが実際に使用するインデックスを表示します。インデックスが使用されていない場合はNULLとして表示されます。

8. キーの長さ

インデックスで使用されるバイト数を示します。この列は、クエリで使用されるインデックスの長さを計算するために使用できます。

9. ref は、テーブルのインデックスフィールドがどのテーブルのどのフィールドに関連付けられているかを示します。

注: equipテーブルとdict_equipテーブルの両方にインデックスを追加しました。インデックス列はn_equip_idです。

上記の実行プランからわかるように、インデックスが最初に使用されます。

10. 行: テーブルの統計と選択に基づいて、検索または読み取るレコードまたは行の数を大まかに見積もってください。値が小さいほど良いです。

たとえば、ある列にインデックスがなくても、一意です。このとき、検索中にテーブル全体を読み込むと、その値はテーブル内のデータ量と同じになります。このとき、最適化する必要があるのは、できるだけ少ないテーブルを読み込むことです。インデックスを追加することで、読み込まれる行数を減らすことができます。

11. フィルター: 読み取られた行のパーセンテージとして返される行のパーセンテージ。値が大きいほど、優れています。

たとえば、テーブル全体に 100 件のレコードが含まれている場合、テーブル内のすべてのデータが読み取られる可能性がありますが、一致するレコードは 1 つだけです。この場合、パーセンテージは 1 です。したがって、この比率をできるだけ大きくする必要があります。つまり、読み取られるデータはできるだけ有用である必要があり、IO には非常に時間がかかるため、未使用のデータの読み取りは避ける必要があります。

12. 追加

以下は最も一般的なものです

use filesort: MySQL では、行をソート順に取得する方法を判断するために追加のパスが必要です。この値が true の場合、インデックスは最適化される必要があります。

一時テーブルを使用する: クエリを解決するには、MySQL は結果を保持するための一時テーブルを作成する必要があります。典型的なケースとしては、クエリに、異なるケースで列をリストする GROUP BY 句と ORDER BY 句が含まれている場合です。

インデックスの使用: 実際の行をさらに検索して読み取ることなく、インデックス ツリーの情報のみを使用してテーブルから列情報を取得します。この戦略は、クエリが単一のインデックスの一部である列のみを使用する場合に使用できます。

where句を使用する: where句は行を制限するために使用されます

要約する

SQL 最適化の原則は、正確性を確保しながら時間を短縮することです。目標は明確です。目標を押し下げることで、迅速に実行したい場合は、できるだけ少ないデータを読み取らなければならないことがわかります。読み取るデータ量を減らすには、フィルタリングとインデックスの使用の 2 つの主要な方法しかありません。このようなルールの範囲内で最適化しますが、インデックスは余分なスペースを占有するため、2 つの関係のバランスを取る必要があることに注意してください。

MySQL の説明プランの使い方がわからないために発生する SQL 最適化エラーに関するこの記事はこれで終わりです。SQL 最適化と MySQL の説明プランの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL実行計画を学ぶ
  • MySQL実行計画の詳細な分析
  • mysql 実行プラン ID が空である (UNION キーワード) の詳細な説明
  • MySQL 実行計画の紹介

<<:  Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します

>>:  Linux の一般的なコマンドとショートカット キーの紹介

推薦する

MySQLのインデックス選択と最適化の詳細な説明

目次インデックスモデルB+ツリーインデックスの選択インデックスの最適化インデックスの選択性カバーイン...

vue-cli4.5.xはプロジェクトを素早く構築します

1. vue-cliをインストールする vue.js で vue.js を実行します。 2. プロジ...

Docker可視化ツールPortainerの導入と中国語翻訳

#docker 検索#docker プルポーター1. イメージを取得した後、中国語パッケージをダウン...

Bootstrap 3.0 学習ノートボタンスタイル

この記事では主にボタンのスタイルについて説明します。 1. オプション2. サイズ3. 活動状況4....

JS 1次元配列を3次元配列に変換する例

今日、CSDN の Q&A セクションで友人が質問をしているのを見ました。彼は 1 次元配列...

React NativeのstartReactApplicationメソッドの簡単な分析

今回は、 RNの起動処理を整理しました。最後のstartReactApplication比較的複雑で...

MySQLは実際に分散ロックを実装できる

序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...

フロントエンドJSサンドボックスを実装するいくつかの方法についての簡単な説明

目次序文iframeはサンドボックスを実装しますdiffメソッドを使用したサンドボックスの実装プロキ...

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

MySQL で左結合を使用して where 条件を追加する問題の詳細な分析

現在の需要:グループとファクターの 2 つのテーブルがあります。1 つのグループは複数のファクターに...

CSSマスクのフルスクリーン中央揃えを実装する方法

具体的なコードは次のとおりです。 <スタイル> #トーストローダーフルスクリーン{ 高さ...

Vueフィルターの詳細な説明

<本文> <div id="ルート"> <h2&...

MySQLクエリ文を書き換える3つの戦略

目次複雑なクエリとステップバイステップのクエリクエリステートメントを分割する共同クエリの分解問題のあ...

CSS パフォーマンスの最適化 - will-change の使用方法の詳細な説明

will-change は、要素にどのような変更が行われるかをブラウザに伝え、ブラウザが事前に最適化...