目次
インデックスのこの章は、次の部分に分かれて学習します。
- インデックスの概要
- インデックス構造
- 指数の分類
- インデックス構文
- SQLパフォーマンス分析
- インデックスの使用法
- インデックス設計の原則
インデックスの概要
導入
インデックス (インデックス) は、 MySQL がデータを効率的に取得できるようにする(順序付けられた)データ構造です。データベース システムは、データに加えて、特定の検索アルゴリズムを満たすデータ構造も維持します。これらのデータ構造は、何らかの方法でデータを参照 (ポイント) するため、これらのデータ構造に高度な検索アルゴリズムを実装できます。このデータ構造は、インデックスです。
インデックスなしでテーブル データをクエリする場合 (たとえば、年齢が 45 歳に等しいクエリを実行する場合)、
テーブル全体をスキャンして、クエリ条件を満たしているかどうかを 1 つずつ照合する必要があります。
二分検索ツリー構造を使用してインデックスを作成すると、クエリ時にテーブル全体のスキャンを実行する必要がなく、テーブル内の年齢が 45 に等しい情報を迅速に見つけることができます。
長所と短所
アドバンテージ | 短所 |
---|---|
データ取得効率を向上させ、データベース IO コストを削減します。 | インデックス列にもスペースが必要です |
インデックス列を介してデータを並べ替えると、データの並べ替えのコストが削減され、CPU 消費量が削減されます。 | インデックスを使用するとクエリの効率が大幅に向上しますが、同時にテーブルの更新速度も低下します。たとえば、テーブルに対して INSERT、UPDATE、DELETE を実行すると効率が低下します。 |
テーブル内のインデックス フィールド データが頻繁に変更されると、インデックスのメンテナンス作業も頻繁になり、データの不整合の問題が発生する可能性もあります。
インデックス構造 (1)
導入
以前にストレージ エンジンについて学んだとき、MySQLインデックスはストレージ エンジン層で実装されていることがわかりました。ストレージ エンジンが異なればインデックス構造も異なり、主に次のものが含まれます (いくつかのデータ構造の基本はよく理解されています)。
インデックス構造 | 説明する |
---|---|
B+ツリーインデックス
|
最も一般的なインデックス タイプ。ほとんどのエンジンが B+ ツリー インデックスをサポートします。
|
ハッシュ
インデックス
|
基礎となるデータ構造はハッシュ テーブルを使用して実装されており
、
インデックス列に正確に一致するクエリのみが有効
です
。
サポート範囲クエリ
|
R ツリー (
空間インデックス)
鉛)
|
空間インデックスは
MyISAM
エンジンの特殊なインデックス タイプで、主に地理空間データ クラスに使用されます。
タイプ、通常あまり使用されない
|
全文(
全文
インデックス
)
|
これは、逆索引を確立する
ことによって
文書を迅速に照合する方法です。に似ている
ルシーン、Solr、ES
|
B+ ツリーが最も一般的に使用されます。ここでは B+ ツリーに焦点を当てます。
次に、インデックス構造に対するさまざまなストレージ エンジンのサポートを見てみましょう。
索引 | InnoDB | マイISAM | メモリ |
---|---|---|---|
B+ツリー
インデックス
|
サポート
|
サポート
|
サポート
|
ハッシュ
インデックス
|
サポートしません
|
サポートしません
|
サポート
|
R ツリー
インデックス
|
サポートしません
|
サポート |
サポートしません
|
全文
|
バージョン5.6以降でサポートされる
|
サポート | サポートしません |
二分木
MySQLのインデックス構造が二分木のデータ構造を採用している場合、理想的な構造は次のとおりです。
主キーが連続して挿入される場合、次の構造を持つ一方向リンク リストが形成されます。
したがって、インデックス構造としてバイナリ ツリーを選択すると、次のような欠点があります。
- 連続して挿入すると、リンクされたリストが形成され、クエリのパフォーマンスが大幅に低下します。
- データ量が多い場合は階層が深くなり、検索速度が遅くなります。
この時点で、赤黒ツリーを選択できると思われるかもしれませんが、赤黒ツリーは自己平衡型二分木です。データがシーケンシャルに挿入された場合でも、最終的なデータ構造は平衡型二分木になります。以下のとおりであります:
ただし、それでも、赤黒木も二分木であるため、次のような欠点があります。
- データ量が多い場合は階層が深くなり、検索速度が遅くなります。
したがって、MySQLのインデックス構造ではバイナリツリーや赤黒ツリーは選択されず、B+Treeが選択されます。
B+Tree を学ぶ前に、B-Tree を紹介しましょう。
B ツリー
B ツリー、B ツリーはマルチフォークのロードマップ検索ツリーであり、バイナリ ツリーと比較して、B ツリーの各ノードは複数の分岐、つまりマルチフォークを持つことができます。
最大次数 (max-degree) が 5 (次数 5) の B ツリーを例にとると、この B ツリーの各ノードは最大 4 つのキーと 5 つのポインターを格納できます。
注: ツリーの次数は、ノードの子ノードの数を指します。
データ構造を視覚化する Web サイトを通じて、これを簡単に実証できます。
https://www.cs.usfca.edu/~galles/visualization/BTree.html
一連のデータを挿入します: 100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120
268 250。次に、データの挿入中のノードの変化を観察します。
特徴:
- 5 次の B ツリーは、5 つのポインターに対応する、ノードごとに最大 4 つのキーを格納します。
- ノードに格納されているキーの数が 5 に達すると、ノードが分裂し、中間要素が上向きに分割されます。
- B ツリーでは、非リーフ ノードとリーフ ノードの両方にデータが格納されます。
終わり
学習内容: ダークホース プログラマー - MySQL データベース コース