1. インデックスの基本1. インデックスの種類1.1 Bツリーインデックスほとんどの MySQL ストレージ エンジンは、デフォルトで B+ ツリー インデックスを使用します。ストレージ エンジンによって、B+ ツリー インデックスの使用方法は異なります。MyISAM はプレフィックス圧縮テクノロジを使用してインデックスを小さくしますが、InnoDB はメタデータ形式でインデックスを保存します。MyISAM インデックスはデータの物理的な場所によってインデックス行を参照しますが、InnoDB は主キーに基づいてインデックス行を参照します。 B ツリーと B+ ツリー Bツリー: B+ツリー: 違い:
実際のアプリケーションでは、オペレーティング システムのファイル インデックス作成やデータベース インデックス作成に B ツリーよりも B+ ツリーの方が適しているのはなぜですか?
赤黒木を使わないのはなぜですか?
1.2 ハッシュインデックスハッシュ インデックスはハッシュ テーブルに基づいて実装されます。データの各行について、ストレージ エンジンはすべてのインデックス列のハッシュ コードを計算します。ハッシュ コードは O(1) 時間で検索に使用できますが、並べ替えやグループ化には使用できません。完全検索のみがサポートされており、部分検索や範囲検索には使用できません。 MySQL では、メモリ エンジンのみがハッシュ インデックスを明示的にサポートします。 InnoDB ストレージ エンジンには、「アダプティブ ハッシュ インデックス」と呼ばれる特別な機能があります。インデックス値が頻繁に使用される場合、B+Tree インデックスの上にハッシュ インデックスが作成されます。これにより、B+Tree インデックスは、高速ハッシュ検索など、ハッシュ インデックスの利点の一部を得ることができます。 1.3 空間データインデックス(Rツリー)MyISAM ストレージ エンジンは空間データ インデックス (R ツリー) をサポートしており、地理データのストレージに使用できます。空間データはすべての次元からデータをインデックス化し、複合クエリに任意の次元を効果的に使用できます。 データを保守するには、GIS 関連の機能を使用する必要があります。 1.4 全文索引MyISAM ストレージ エンジンは、テキスト内のキーワードを直接比較するのではなく、テキスト内のキーワードを検索するために使用されるフルテキスト インデックスをサポートしています。 検索条件では、通常の WHERE ではなく MATCH AGAINST を使用します。フルテキスト インデックスは、キーワードとそれが配置されているドキュメントのマッピングを記録する逆インデックスを使用して実装されます。 InnoDB ストレージ エンジンも、MySQL バージョン 5.6.4 でフルテキスト インデックスのサポートを開始しました。 2. インデックスの利点と欠点アドバンテージ
欠点
3. 高性能インデックス戦略1. 独立した列MySQL クエリ内の列が独立していない場合、インデックスは使用されません。「独立した列」とは、インデックス列を式または関数パラメータの一部にすることができないことを意味します。 例えば mysql> SELECT id, name FROM t_user WHERE id + 1 = 5; MySQL はこの id + 1 方程式を解析できません。WHERE 条件を簡素化する習慣を身につける必要があります。 2. プレフィックスインデックス非常に長い文字列にインデックスを付ける必要がある場合があり、その場合、インデックスが大きくなり、速度が遅くなります。 たとえば、BLOB、TEXT、および VARCHAR タイプの列の場合、プレフィックス インデックスを使用して先頭の文字のみをインデックスする必要があります。 プレフィックス長の選択はインデックスの選択性に基づいて決定する必要がある 3. 複数列インデックス多くの人は、複数列インデックスを完全に理解していません。よくある間違いは、各列に個別のインデックスを作成したり、複数列インデックスを間違った順序で作成したりすることです。 ほとんどの場合、複数の列に独立した単一列インデックスを作成しても、MySQL のクエリ パフォーマンスは向上しません。そのため、「インデックス マージ」戦略が導入され、テーブル上の複数の単一列インデックスを使用して、指定された行をある程度特定できるようになりました。 たとえば、次のステートメントでは、ユーザー名とパスワードを複数列のインデックスとして設定するのが最適です。 t_user からユーザー名、パスワードを選択します。ユーザー名 = 'Aiguodala'、パスワード = 'Aiguodala'; 4. 適切なインデックス列の順序最も選択性の高いインデックス列を先頭に配置します。 インデックスの選択性は、一意のインデックス値とレコードの総数の比率を指します。最大値は 1 です。この場合、各レコードにはそれに対応する一意のインデックスが存在します。選択性が高くなるほど、各レコードの区別が容易になり、クエリの効率が高くなります。 5. クラスター化インデックスクラスター化インデックスは、個別のインデックス タイプではなく、データを格納する方法です。「クラスター化」という用語は、データ行と隣接するキー値がコンパクトにまとめて格納されることを意味します。 InnoDB は主キーによってデータをクラスター化します。主キーが定義されていない場合、InnoDB は代わりに一意の空でないインデックスを選択します。そのようなインデックスがない場合、InnoDB は暗黙的に主キーをクラスター化インデックスとして定義します。 集約データの利点と欠点 アドバンテージ:
欠点:
非クラスター化インデックス データはインデックスで区切られた構造で保存されます。インデックス構造のリーフノードは、データの対応する行を指します。MyISAM は、key_buffer を介してインデックスをメモリにキャッシュします。データにアクセスする必要がある場合 (インデックスを介してアクセスする場合)、メモリ内でインデックスを直接検索し、次にインデックスを介してディスク上の対応するデータを見つけます。これが、インデックスがキーバッファにヒットしない場合に速度が遅くなる理由です。 6. カバーインデックスインデックスは、クエリする必要があるすべてのフィールドの値をカバーします 利点:
3. クエリパフォーマンスの最適化1. パフォーマンス分析を説明するEXPLAIN キーワードを使用して、オプティマイザーをシミュレートし、SQL クエリ ステートメントを実行して、MySQL が SQL ステートメントをどのように処理するかを確認します。クエリステートメントまたはテーブル構造のパフォーマンスボトルネックを分析する 例: 1.1 id: 表の読み取り順序id は選択クエリのシーケンス番号であり、クエリ内で選択句または操作テーブルが実行される順序を示す一連の数字が含まれます。 IDは同じです: 実行順序は上から下です EXPLAIN SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.id = t3.id; 異なるID: 実行順序はIDが大きい方が先に実行されます EXPLAIN SELECT t2.id FROM t2 WHERE t2.id = (t1.idをt1から選択する。t1.id = (t3からt3.idを選択) ); 1.2 select_type: クエリ操作タイプselect_typeはクエリの種類を表し、主に共通クエリ、結合クエリ、サブクエリ、その他の複雑なクエリを区別するために使用されます。
1.3 表: 表のソース表は、このデータがどの表に基づいているかを示します 1.4 タイプ: アクセスタイプtype はクエリのアクセス タイプです。これはより重要な指標です。結果は最良から最悪まで次のとおりです。 システム > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all --一般的な順序は、system > const > eq_ref > ref > range > index > all です。 一般的に言えば、クエリが少なくとも範囲レベル、できれば参照レベルに到達するようにする必要があります。
1.5 possible_key: 可能なインデックスこのテーブルに適用される可能性のある 1 つ以上のインデックスを表示します。クエリに関係するフィールドにインデックスがある場合、そのインデックスはリストされますが、クエリによって実際に使用されない可能性があります。 1.6 キー: 実際に使用されるインデックス実際に使用されるインデックス。 NULL の場合、インデックスは使用されません。 1.7 key_len: インデックスで使用されるバイト数インデックスで使用されるバイト数を示します。この列は、クエリで使用されるインデックスの長さを計算するために使用できます。 key_len フィールドは、インデックスが完全に使用されているかどうかを確認するのに役立ちます。 ken_len が長いほど、インデックスがより完全に使用されます。 1.8 ref: 使用されているインデックスの詳細情報を表示しますref は、インデックスのどの列が使用されているかを示し、可能な場合は定数にすることができます。インデックス列の値を検索するために使用される列または定数 1.9 行: クエリされた行数行列には、クエリを実行するために MySQL が調べる必要があると想定している行数が表示されます。少ないほど良いです! 1.10 追加: 追加の重要な情報その他の重要な追加情報
要約するこれで、MySQL での高性能インデックスの作成に関するこの記事は終了です。MySQL の高性能インデックスに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: フレックスとポジションの互換性の詳細な説明マイニングノート
>>: Docker イメージのデフォルトの保存場所を変更する方法 (ソリューション)
MySQLにおける静的変数の役割の詳細な説明静的変数の使用 静的変数サンプルコード: 関数テスト()...
目次1. Nginxロケーションの基本設定1.1 Nginx 設定ファイル1.2 Pythonスクリ...
目次序文コンセプト安定意味使用シナリオコードVueでの使用スロットリング意味使用シナリオコードVue...
目次1. シナリオ2. 基盤となるAPIを簡素化する2.1 自動的に破棄を呼び出す2.2 VM値を作...
1. docker設定ファイルを変更し、ポート2375を開きます。 [root@s162 docke...
前提条件: nginx には、ngx_http_limit_conn_module モジュールと n...
MySQL インストール パッケージをダウンロードします。mysql-8.0.11-winx64 を...
文章さて、次はレンダリングを見せましょう。画像を見て初めて理解することに興味が湧くでしょう。そうでな...
目次序文undefined と null の混同紛らわしい数値の加算と文字列の連結戻り文の改行の問題...
エフェクト表示: 環境準備コントローラーノード: 6GB 4時間60GB/30GB/30GB計算ノー...
この記事では、パーセンテージスコアリングプログレスバーを実現するためのjQueryの具体的なコードを...
この記事では、参考までにMySQL 8.0.15のインストールと設定方法のグラフィックチュートリアル...
<テンプレート> <div class="demo">...
MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...
パスワードモードPDO::__construct(): サーバーがクライアントに不明な認証方法を要求...