プレフィックスインデックス
説明
テーブル作成時に、ソートキーを構成する1つ以上のカラムを指定します。テーブル内のデータ行はソートキーに基づいてソートされ、その後ディスクに保存されます。
データ書き込み時に、プレフィックスインデックスは自動的に生成されます。指定されたソートキーに従ってデータがソートされた後、1024行ごとに1つの論理データブロックに含まれま す。その論理データブロックの最初のデータ行のソートキーカラムの値で構成されるインデックスエントリがプレフィックスインデックステーブルに追加されます。
これらの2層のソート構造により、クエリはバイナリサーチを使用してクエリ条件を満たさないデータを迅速にスキップでき、クエリ中の追加のソート操作を回避できます。
プレフィックスインデックスはスパースインデックスであり、そのサイズはデータ量の少なくとも1024分の1です。したがって、通常はメモリに完全にキャッシュされ、クエリパフォーマンスを加速します。
使用上の注意
v3.0以降、主キーテーブルはORDER BY
を使用してソートキーを定義することをサポートしています。v3.3以降、重複キーテーブル、集計テーブル、およびユニークキーテーブルはORDER BY
を使用してソ ートキーを定義することをサポートしています。
-
重複キーテーブルのデータは、ソートキー
ORDER BY
に従ってソートされます。ソートキーは任意のカラムの組み合わせにできます。備考ORDER BY
とDUPLICATE KEY
の両方が指定されている場合、DUPLICATE KEY
は効果を発揮しません。 -
集計テーブルのデータは、まず集計キー
AGGREGATE KEY
に従って集計され、その後ソートキーORDER BY
に従ってソートされます。ORDER BY
とAGGREGATE KEY
のカラムは同じである必要がありますが、カラムの順序は同じである必要はありません。 -
ユニークキーテーブルのデータは、まずユニークキー
UNIQUE KEY
に従って置換され、その後ソートキーORDER BY
に従ってソートされます。ORDER BY
とUNIQUE KEY
のカラムは同じである必要がありますが、カラムの順序は同じである必要はありません。 -
主キーテーブルのデータは、まず主キー
PRIMARY KEY
に従って置換され、その後ソートキーORDER BY
に従ってソートされます。
重複キーテーブルを例にとります。ソートキーはuid
とname
としてORDER BY
を使用して定義さ れています。
CREATE TABLE user_access (
uid int,
name varchar(64),
age int,
phone varchar(16),
last_access datetime,
credits double
)
ORDER BY (uid, name);
テーブル作成後、SHOW CREATE TABLE <table_name>;
を使用して、指定されたソートカラムとORDER BY
句内のこれらのカラムの順序を返された結果から確認できます。
プレフィックスインデックスエントリの最大長は36バイトであるため、超過部分は切り捨てられます。したがって、このテーブルのプレフィックスインデックスの各エントリは、uid (4バイト) + name (最初の32バイトのみ)であり、プレフィックスフィールドはuid
とname
です。
注意
-
プレフィックスフィールドの数は3を超えることはできず、プレフィックスインデックスエントリの最大長は36バイトです。
-
プレフィックスフィールド内では、CHAR、VARCHAR、またはSTRING型のカラムは1回しか現れず、末尾に配置する必要があります。
以下のテーブルを例にとります。最初の3つのカラムがソートキーカラムです。このテーブルのプレフィックスフィールドは
name
(20バイト)です。これは、このプレフィックスインデックスがVARCHAR型のカラム(name
)で始まり、36バイトの長さに達していない にもかかわらず、さらにカラムを含まずに直接切り捨てられるためです。したがって、このプレフィックスインデックスにはname
フィールドのみが含まれています。MySQL [example_db]> describe user_access2;
+-------------+-------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-------+---------+-------+
| name | varchar(20) | YES | true | NULL | |
| uid | int | YES | true | NULL | |
| last_access | datetime | YES | true | NULL | |
| age | int | YES | false | NULL | |
| phone | varchar(16) | YES | false | NULL | |
| credits | double | YES | false | NULL | |
+-------------+-------------+------+-------+---------+-------+
6 rows in set (0.00 sec) -
テーブルで
ORDER BY
を使用してソートキーが指定されている場合、プレフィックスインデックスはソートキーに基づいて形成されます。ソートキーがORDER BY
で指定されていない場合、プレフィックスインデックスはキーのカラムに基づいて形成されます。