web-dev-qa-db-ja.com

Mysqlの複数列のインデックスの構造は何ですか?

例えば:
_CREATE TABLE test(
col_1 INT,
col_2 INT,
col_3 VARCHAR(11),
col_4 VARCHAR(11) )ENGINE = INNODB;
_
CREATE INDEX mul ON test(col_2,col_3,col_4);

申し訳ありませんが、私の英語は上手ではありません。つまり、複数列のインデックスを作成します。このインデックス構造は何ですか?

1
kuidx

注:この回答が書かれた時点での質問は次のとおりです。

Bツリーインデックスでは、単一行のすべての列が一緒に格納されますか、それとも列が別々の構造に格納されますか?


ほとんどのRDBMS(MySQLを含む)は、BツリーではなくB +ツリーとしてインデックスを実装します。 B + Treeインデックスには、クラスター化インデックスと非クラスター化インデックスの2種類があります。

どちらも、インデックスの各中間レベル(ルートを含む)に、キーを構成するすべての列が含まれているという共通点があります。リーフレベルには、すべての主要な列と追加情報が含まれています。

クラスター化インデックスでは、その追加情報はそのテーブルの他のすべての列です。非クラスター化インデックスの場合、その追加情報には、少なくとも実際のテーブル行への参照が含まれます。一部のRDBMSでは、ここに列、いわゆる「インクルード」列を追加することもできます。

いずれにせよ、B + Treeには、単一のB-Treeノード内の現在のインデックスレベルに関連する完全なタプルが常に含まれます(通常はデータページに相当します。このストレージ構成は「N-aryストレージモデル」またはNSM。

一部のRDBMSは、列ストアインデックスを備えたSQL Serverのように、列指向のストレージを許可します。そのモデルは「分解ストレージモデル」またはDMSと呼ばれます。ただし、DSMを使用する構造は、B +ツリー(またはBツリー)として編成されていません。

2つのアイデアを組み合わせたストレージの3番目の形式があります。これはPAX(パーティション属性全体)と呼ばれます。ただし、実装されることはめったにありません。

参照:

http://en.wikipedia.org/wiki/B%2BTree

http://www.pdl.cmu.edu/ftp/Database/pax.pdf

http://en.wikipedia.org/wiki/Column-ientified_DBMS

2
Sebastian Meine