プレフィックスインデックス
説明
テーブル作成時に、ソートキーを構成する1つ以上のカラムを指定します。テーブル内のデータ行はソートキーに基づいてソートされ、その後ディスクに保存されます。
データ書き込み時に、プレフィックスインデックスは自動的に生成されます。指定されたソートキーに従ってデータがソートされた後、1024行ごとに1つの論理データブロックに含まれます。この論理データブロックの最初のデータ行のソートキーカラムの値からなるインデックスエントリがプレフィックスインデックステーブルに追加されます。
これらの2層のソート構造により、クエリはバイナリサーチを使用してクエリ条件を満たさないデータを迅速にスキップでき、クエリ中の追加のソート操作を回避することもできます。
プレフィックスインデックスはスパースインデックスであり、そのサイズはデータ量の少なくとも1024分の1です。したがって、通常はメモリに 完全にキャッシュされ、クエリパフォーマンスを加速します。
使用上の注意
重複キーテーブルの場合、ソートキーカラムは DUPLICATE KEY で指定されます。集計テーブルまたはユニークキーテーブルの場合、ソートキーカラムは制約カラムと結合され、AGGREGATE KEY または UNIQUE KEY で指定されます。v3.0以降、主キーテーブルはソートキーカラムと主キーカラムを分離し、より柔軟な機能を提供します。ソートキーカラムは ORDER BY で指定され、主キーカラムは PRIMARY KEY で指定されます。
次の例では、ユニークキーテーブルを使用して、テーブル作成時にソートキーカラムを指定し、それらがどのようにプレフィックスインデックスを構成するかを示します。
ユニークキーテーブルを作成する際、DUPLICATE KEY で uid と name をソートキーカラムとして指定できます。
CREATE TABLE user_access (
uid int,
name varchar(64),
age int,
phone varchar(16),
last_access datetime,
credits double
)
DUPLICATE KEY(uid, name);
ユニークキーテーブル、集計テーブル、またはユニークキーテーブルを作成した後、DESCRIBE <table_name>; を使用してそのソートキーカラムを表示できます。返された結果では、Key フィールドが true と表示されているカラムがソートキーカラムです。主キーテーブルを作成した後、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)