web-dev-qa-db-ja.com

複合インデックスはどのように機能しますか?

前に、テーブルに複合インデックス(indices数学者向け)を作成しました。私の仮定が正しいかどうかだけに興味がありました。

インデックスの列の順序をリストするとき、インデックスのグループ化方法も指定していると思います。たとえば、列ab、およびcがあり、同じ順序でインデックスを指定する場合a ASCb ASC、およびc ASCその場合、結果のインデックスは、本質的にaの各「グループ」の多くのインデックスになります。

これは正しいです?そうでない場合、結果のインデックスは実際にどのようになりますか?

60
Joe Phillips

複合インデックスは、複数の値を持つキーを除いて、通常のインデックスと同じように機能します。

フィールド(a、b、c)にインデックスを定義すると、レコードは最初にa、b、cの順にソートされます。

例:

| A | B | C |
-------------
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 4 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 5 |
70
Rik

複合インデックスは、辞書のプレーンアルファベットインデックスに似ていますが、次のように2文字以上をカバーします。

AA - page 1
AB - page 12

等.

テーブルの行は最初にインデックスの最初の列、次に2番目の列などの順序になります。

両方の列で検索する場合に使用できますOR最初の列で。インデックスが次のような場合:

AA - page 1
AB - page 12
…
AZ - page 245
BA - page 246
…

2文字(テーブルの= 2列)の検索、または1文字のプレーンインデックスの検索に使用できます。

A - page 1
B - page 246
…

辞書の場合、ページ自体はアルファベット順になっていることに注意してください。これは、CLUSTEREDインデックスの例です。

プレーンな非CLUSTEREDインデックスでは、歴史の本のように、ページへの参照が順序付けられます。

Gaul, Alesia: pages 12, 56, 78
Gaul, Augustodonum Aeduorum: page 145
…
Gaul, Vellaunodunum: page 24
Egypt, Alexandria: pages 56, 194, 213, 234, 267

複合インデックスは、ORDER BY 2つ以上の列がある場合にも使用できます。この場合、DESC句が便利です。

複合インデックスでのDESC句の使用に関する私のブログの次の記事を参照してください。

31
Quassnoi

インデックスの最も一般的な実装では、Bツリーを使用して、ある程度高速なルックアップと、適度に高速な範囲スキャンを可能にします。ここで説明するのは多すぎますが、ここに B-trees に関するWikipediaの記事があります。そして、あなたは正しいです。作成インデックスで宣言する最初の列は、結果のBツリーの上位列になります。

高次列の検索は範囲スキャンに相当し、Bツリーインデックスはこのような検索に非常に役立ちます。これを確認する最も簡単な方法は、オンラインカタログにまだ変換されていないライブラリにある古いカードカタログとの類推です。

姓が「Clemens」である著者のすべてのカードを探している場合は、著者カタログに移動するだけで、前面に「CLE-CLI」と書かれた引き出しがすぐに見つかります。それが正しい引き出しです。次に、その引き出しで一種の非公式のバイナリ検索を実行して、「クレメンス、ロジャー」または「クレメンス、サミュエル」と書かれているすべてのカードをすばやく見つけます。

しかし、名が「Samuel」である著者のすべてのカードを検索するとします。これらのカードはAuthorカタログの1か所に集められていないため、ここまで来ました。同様の現象は、データベースの複合インデックスでも発生します。

DBMSによって、インデックス範囲のスキャンを検出し、コストを正確に推定するオプティマイザーの巧妙さが異なります。また、すべてのインデックスがBツリーではありません。実際の情報を取得するには、特定のDBMSのドキュメントを読む必要があります。

17
Walter Mitty

いいえ。結果のインデックスは単一インデックスですが、複合キーがあります。

KeyX = A、B、C、D; KeyY = 1,2,3,4;

インデックスKeyX、KeyYは実際にはA1、A2、A3、B1、B3、C3、C4、D2になります

そのため、KeyXで何かを見つける必要がある場合and KeyY-これは高速で、単一のインデックスを使用します。 SELECT ... WHERE KeyX = "B" AND KeyY = 3のようなもの。

しかし、理解することが重要です:WHERE KeyX =?要求willそのインデックスを使用し、WHERE KeyY =? [〜#〜] not [〜#〜]このようなインデックスを使用します。

4
Mash

私の理解では、複合インデックスは通常のインデックスと同じように機能しますが、複数値キーがあります。フィールド(a、b、c)にインデックスを定義すると、複合インデックスはBinaryTreeに格納されるため、インデックスは検索の組み合わせに従ってのみ機能します。

ABC
AB
A

たとえば、a、b、cフィールドの複合インデックスを作成することは、a、ab、abcの個別のインデックスを作成することと同等です

0
tk_