2

より良いインデックス構成を理解したい。2 つの列を持つテーブルがあるとします。

CREATE TABLE user( 
  name varchar(100)
 ,age int)

インデックスを作成したいと思います:

CREATE INDEX IDX_MultiColIdx on user(name,age)

B-Tree インデックスの構成はどのようになりますか?

ageなどの 1 つの列の場合、組織は明確です。すべての非葉ノードには、検索に使用される一連の整数キーが含まれます。IDX_MultiColIdx B-Tree インデックスのノードを含む値はどれですか?

4

2 に答える 2

4

IDX_MultiColIdx B-Tree インデックスのノードを含む値はどれですか?

の値nameageおよび行ポインター (テーブル構成に応じてRID/またはクラスター化されたキー) は、辞書順に並べ替えられます。ROWID

それらがどの程度正確に格納されるかは、データ型とデータベース システムによって異なります。

通常、CHARはそのサイズまでスペースで右詰めされて格納され、VARCHARはその長さが先頭に追加されます。

MyISAM他のいくつかのエンジンはキー圧縮を使用できます: キーのセットの一致する部分は一度だけ保存され、他のキーは次のように異なる部分のみを保存します:

Hamblin
Hamblin, California
Hamblin (surname)
Hambling Baronets
Hambly
Hambly Arena    
Hambly Arena Fire
Hambo
Hambo Lama Itigelov
Hambok
Hambone

次のように保存されます。

Hamblin
[7], California
[7] (surname)
[7]g Baronets
Hambly
[6] Arena   
[6] Arena Fire
Hambo
[5] Lama Itigelov
[5]k
[5]ne

、ここで「前のキーから[x]先頭の文字を取得する」ことを意味しますx

于 2010-09-15T07:15:10.147 に答える
1

「非リーフノード」について言及しているので、内部データベースの実装について質問していると思います。

Bツリーの内部ノードは完全なキーを格納する必要はありません。セパレータキーを保存するだけで済みます。プレフィックスとサフィックスの圧縮は、内部ノードが非常に密集している可能性があることを意味します。したがって、bツリーの高さが低くなり、全体的なパフォーマンスが向上します。

たとえば、シーケンシャルキー<'非常に長い文字列'、314159>および<'同じ文字列ではない'、9348>を持つインデックスが与えられた場合、内部ノードが表す必要があるのは、これらのキー間の分離だけです。 1文字で表されます。同様に、内部ノードで分離されるキーに共通のプレフィックスがある場合、そのプレフィックスは1回だけ保存する必要があり、それらが分岐するポイントが表されます。

リーフノードは完全なキー値を格納する必要があり、キー順序トラバーサル用のリンクリストに格納できます。リーフノードページは、プレフィックス圧縮またはその他の手法を使用して圧縮し、ツリーの高さをさらに下げることができます。

これに関する適切なリファレンスについては、Gray&Reuterによる「トランザクション処理:概念と手法」を参照してください。詳細が必要な場合は、リファレンスに従ってください。

于 2010-09-15T07:47:36.063 に答える