このページでは、PolarDB for MySQL クラスターでテーブルレベルのインメモリ列指向インデックス (IMCI) を作成および削除するための DDL 文について説明します。
バージョン要件
ご利用のクラスターは、次のいずれかのバージョンを実行している必要があります:
PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.45 以降
PolarDB for MySQL 8.0.2、リビジョンバージョン 8.0.2.2.27 以降
単一テーブルのコマンド
テーブルレベル IMCI の作成
CREATE COLUMNAR INDEX ON <db_name>.<table_name>;
CREATE COLUMNAR INDEX ON <table_name>;「db_name」を省略すると、この文は現在のセッションのデータベースを対象とします。セカンダリインデックスとは異なり、インデックス名や含める列を指定する必要はありません。IMCI はすべての列を自動的にカバーします。
テーブルに既に IMCI が存在する場合にエラーを回避するには、IF NOT EXISTS を ON の前に追加します。
CREATE COLUMNAR INDEX IF NOT EXISTS ON <db_name>.<table_name>;デフォルトでは、この文は以下と同等です:
ALTER TABLE <db_name>.<table_name> COMMENT 'COLUMNAR=1 <OLD_COMMENT>';上記の等価性は、allow_implicit_imci_alter_commentがON(デフォルト)に設定されている場合にのみ適用されます。OFFに設定すると、テーブルのコメントを変更せずに IMCI が作成されます。詳細については、「テーブルのコメントを変更せずにテーブルレベル IMCI を作成する」をご参照ください。
すべての列を対象とする代わりにカスタム IMCI を設定するには、「IMCI の拡張属性を使用して IMCI をカスタマイズする」をご参照ください。
IMCI 作成ステータスの確認
IMCI を作成した後、次のコマンドを実行して準備が完了したかどうかを確認します:
SHOW IMCI INDEXES;STATE フィールドは、現在のステータスを示します:
| 状態 | 説明 |
|---|---|
COMMITTED | IMCI は準備が完了しており、クエリで利用可能です。 |
RECOVERING | 既存のデータから IMCI を構築中です。 |
RECOVER_BUILDING | リカバリーイベントの後、IMCI を再構築中です。 |
テーブルレベル IMCI の削除
DROP COLUMNAR INDEX ON <db_name>.<table_name>;
DROP COLUMNAR INDEX ON <table_name>;db_name が省略された場合、この文は現在の会話のデータベースを対象とします。インデックス名を指定する必要はありません。
IMCI が既に削除されている場合のエラーを回避するには、IF EXISTS を ON の前に追加します。
DROP COLUMNAR INDEX IF EXISTS ON <db_name>.<table_name>;この文は、以下の両方を実行することと同等です:
ALTER TABLE <db_name>.<table_name> COMMENT 'COLUMNAR=0 <OLD_COMMENT>';
ALTER TABLE <db_name>.<table_name> COMMENT '<OLD_COMMENT>';バッチ操作
以下の文を使用して、データベース内のすべてのテーブルにまたがる IMCI を一度に作成または削除します。
テーブルレベル IMCI の一括作成
3つの同等の構文オプションがサポートされています:
-- オプション 1
CREATE COLUMNAR INDEX FOR TABLES IN <db_name>;
-- オプション 2
CREATE COLUMNAR INDEX FOR TABLES FROM <db_name>;
-- オプション 3: ストアドプロシージャ (dbms_imci パッケージ)
-- dbms_imci: IMCI 操作を管理するためのデータベースパッケージ
-- add_columnar_index: 指定されたデータベース内のすべてのテーブルに IMCI を作成します
CALL dbms_imci.add_columnar_index('<db_name>');3 つのオプションすべては、<db_name> 内でまだテーブルレベル IMCI を持っていないすべてのテーブルに対して、テーブルレベル IMCI を作成します。
ストアドプロシージャは、オプションの set_implicit パラメーターを受け入れます。1 に設定すると、データベースに implicit_imci マーカーが追加され、そのデータベースで作成された新しいテーブルに自動的に IMCI が付与されます。
CALL dbms_imci.add_columnar_index('<db_name>', 1);例
次の例では、tpch データベース内のすべてのテーブルに対して IMCI を作成し、結果を確認します:
mysql> SHOW TABLES IN tpch;
+--------------------+
| Tables_in_tpch |
+--------------------+
| customer |
| lineitem |
| nation |
| orders |
| part |
| partsupp |
| region |
| revenue0 |
| supplier |
+--------------------+
9 rows in set (0.01 sec)
mysql> SHOW IMCI INDEXES;
Empty set (0.02 sec)
mysql> CREATE COLUMNAR INDEX FOR TABLES IN tpch;
+------------+--------+
| Table_Name | Result |
+------------+--------+
| customer | Ok |
| lineitem | Ok |
| nation | Ok |
| orders | Ok |
| part | Ok |
| partsupp | Ok |
| region | Ok |
| supplier | Ok |
+------------+--------+
8 rows in set (0.56 sec)
-- STATE フィールドを確認します。COMMITTED は IMCI が準備完了であることを意味します。
-- RECOVERING と RECOVER_BUILDING は、まだ構築中であることを意味します。
mysql> SHOW IMCI INDEXES;
+----------+-------------+------------+----------+-----------+-----------+---------+------------------+---------------------+-----------------------------+--------------+
| TABLE_ID | SCHEMA_NAME | TABLE_NAME | NUM_COLS | NUM_PACKS | PACK_SIZE | ROW_ID | STATE | STATE_UPDATE_AT | CHECKPOINT_DATADIR | WRITE_POLICY |
+----------+-------------+------------+----------+-----------+-----------+---------+------------------+---------------------+-----------------------------+--------------+
| 1080 | tpch | region | 3 | 0 | 65536 | 0 | RECOVERING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1080_258 | Tradeoff |
| 1081 | tpch | nation | 4 | 1 | 65536 | 65536 | COMMITTED | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1081_254 | Tradeoff |
| 1082 | tpch | part | 9 | 64 | 65536 | 4194304 | RECOVER_BUILDING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1082_256 | Tradeoff |
| 1083 | tpch | supplier | 7 | 0 | 65536 | 0 | RECOVERING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1083_259 | Tradeoff |
| 1084 | tpch | partsupp | 5 | 0 | 65536 | 0 | RECOVERING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1084_257 | Tradeoff |
| 1085 | tpch | customer | 8 | 64 | 65536 | 4194304 | RECOVER_BUILDING | 2024-09-24 18:50:15 | ./imci_1/imci_chkp_1085_252 | Tradeoff |
| 1086 | tpch | orders | 9 | 0 | 65536 | 0 | RECOVER_BUILDING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1086_255 | Tradeoff |
| 1087 | tpch | lineitem | 15 | 0 | 65536 | 0 | RECOVER_BUILDING | 2024-09-24 18:50:15 | ./imci_1/imci_chkp_1087_253 | Tradeoff |
+----------+-------------+------------+----------+-----------+-----------+---------+------------------+---------------------+-----------------------------+--------------+
8 rows in set, 1 warning (0.07 sec)テーブルレベル IMCI の一括削除
3つの同等の構文オプションがサポートされています:
-- オプション 1
DROP COLUMNAR INDEX FOR TABLES IN <db_name>;
-- オプション 2
DROP COLUMNAR INDEX FOR TABLES FROM <db_name>;
-- オプション 3: ストアドプロシージャ (dbms_imci パッケージ)
-- dbms_imci: IMCI 操作を管理するためのデータベースパッケージ
-- drop_columnar_index: 指定されたデータベース内のすべてのテーブルから IMCI を削除します
CALL dbms_imci.drop_columnar_index('<db_name>');3 つのオプションすべてが、<db_name> 内のすべてのテーブルから既存のテーブルレベル IMCI を削除します。
このストアドプロシージャは、オプションの reset_implicit パラメーターを受け付けます。1 に設定すると、データベースから implicit_imci マーカーが削除され、新しいテーブルが自動的に IMCI を受信することを防止します:
CALL dbms_imci.drop_columnar_index('<db_name>', 1);例
mysql> SHOW IMCI INDEXES;
+----------+-------------+------------+----------+-----------+-----------+-----------+-----------+---------------------+-----------------------------+--------------+
| TABLE_ID | SCHEMA_NAME | TABLE_NAME | NUM_COLS | NUM_PACKS | PACK_SIZE | ROW_ID | STATE | STATE_UPDATE_AT | CHECKPOINT_DATADIR | WRITE_POLICY |
+----------+-------------+------------+----------+-----------+-----------+-----------+-----------+---------------------+-----------------------------+--------------+
| 1080 | tpch | region | 3 | 1 | 65536 | 65536 | COMMITTED | 2024-09-24 18:50:30 | ./imci_1/imci_chkp_1080_258 | Tradeoff |
| 1081 | tpch | nation | 4 | 1 | 65536 | 65536 | COMMITTED | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1081_254 | Tradeoff |
| 1082 | tpch | part | 9 | 306 | 65536 | 20054016 | COMMITTED | 2024-09-24 18:50:30 | ./imci_1/imci_chkp_1082_256 | Tradeoff |
| 1083 | tpch | supplier | 7 | 16 | 65536 | 1048576 | COMMITTED | 2024-09-24 18:50:34 | ./imci_1/imci_chkp_1083_259 | Tradeoff |
| 1084 | tpch | partsupp | 5 | 1221 | 65536 | 80019456 | COMMITTED | 2024-09-24 18:51:15 | ./imci_1/imci_chkp_1084_257 | Tradeoff |
| 1085 | tpch | customer | 8 | 229 | 65536 | 15007744 | COMMITTED | 2024-09-24 18:50:28 | ./imci_1/imci_chkp_1085_252 | Tradeoff |
| 1086 | tpch | orders | 9 | 2289 | 65536 | 150011904 | COMMITTED | 2024-09-24 18:51:23 | ./imci_1/imci_chkp_1086_255 | Tradeoff |
| 1087 | tpch | lineitem | 15 | 9156 | 65536 | 600047616 | COMMITTED | 2024-09-24 18:54:16 | ./imci_1/imci_chkp_1087_253 | Tradeoff |
+----------+-------------+------------+----------+-----------+-----------+-----------+-----------+---------------------+-----------------------------+--------------+
8 rows in set, 1 warning (1.09 sec)
mysql> CALL dbms_imci.drop_columnar_index('tpch');
+-------------+------------+--------+
| Object_Name | Operation | Result |
+-------------+------------+--------+
| customer | drop_index | Ok |
| lineitem | drop_index | Ok |
| nation | drop_index | Ok |
| orders | drop_index | Ok |
| part | drop_index | Ok |
| partsupp | drop_index | Ok |
| region | drop_index | Ok |
| supplier | drop_index | Ok |
+-------------+------------+--------+
8 rows in set (0.33 sec)
mysql> SHOW IMCI INDEXES;
Empty set (0.27 sec)バッチ操作の結果コード
バッチ操作の出力において、Result 列は各テーブルの結果を示します。
| 結果コード | 説明 |
|---|---|
Ok | 操作は正常に完了しました。 |
Skip by unsupported | このテーブルでは操作がサポートされていません。 |
Skip by no change | ターゲットがすでに存在するか、ステータスがすでに一致しています。たとえば、作成時に IMCI がすでに存在する場合や、削除時に IMCI が存在しない場合などです。 |
Skip by concurrent operation | 同時操作の競合により操作が妨げられました。たとえば、別の DDL 文がテーブルにメタデータロック (MDL) を保持している場合などです。 |
Skip by not found | ターゲットオブジェクトが存在しません。 |
Skip by ACL deny | 現在のアカウントには必要な権限がありません。 |
Failed | 操作は失敗しました。 |
テーブルコメントを変更せずにテーブルレベル IMCI を作成
デフォルトでは、CREATE COLUMNAR INDEX ON コマンドは、テーブルのコメントを更新することで IMCI をマークします(コメント内の COLUMNAR=1 と同等です)。テーブルのコメントを変更せずに IMCI を作成するには、セッションパラメーター allow_implicit_imci_alter_comment を OFF に設定します。
| パラメーター | レベル | デフォルト | 説明 |
|---|---|---|---|
allow_implicit_imci_alter_comment | セッション | ON | IMCI が作成される際に、テーブルコメントが変更されるかどうかを制御します。OFF に設定すると、テーブルコメントを更新せずに列指向インデックスを作成できます。 |
「OFF」に設定すると、このパラメーターはすべての3つの作成パスに適用されます:
loose_polar_enable_implicit_imci_with_create_tableがONにセットされている場合のCREATE TABLECREATE COLUMNAR INDEX ON <db>.<table>動的作成用CREATE COLUMNAR INDEX FOR TABLES IN <db_name>による一括作成
例 1: テーブルを作成し、テーブルコメントを変更せずに自動的に IMCI を追加します。
SET allow_implicit_imci_alter_comment = OFF;
SET GLOBAL polar_enable_implicit_imci_with_create_table = ON;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(100));
SHOW CREATE TABLE t1 FULL;
/*
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/例 2: 既存のテーブルに、テーブルコメントを変更せずに動的に IMCI を追加します。
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(100));
SET allow_implicit_imci_alter_comment = OFF;
CREATE COLUMNAR INDEX ON test.t1;
SHOW CREATE TABLE t1 FULL;
/*
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/例 3: 複数のテーブルにまたがって、テーブルコメントを変更せずに IMCI を一括作成します。
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(100));
CREATE TABLE t2 (id INT PRIMARY KEY, code DOUBLE);
SET allow_implicit_imci_alter_comment = OFF;
CREATE COLUMNAR INDEX FOR TABLES IN test;
/*
Table_Name Result
t1 Ok
t2 Ok
*/
SHOW CREATE TABLE t1 FULL;
/*
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/
SHOW CREATE TABLE t2 FULL;
/*
CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`code` double DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/この設定を使用する状況
`allow_implicit_imci_alter_comment = OFF` を使用する場合:
テーブルコメントは、テナント間またはインスタンス間で一貫性を保つ必要があります。たとえば、SaaS 環境では、インメモリー列指向インデックス (IMCI) を持つ large テナントのテーブルと、それを持たない small テナントのテーブルとで、SHOW CREATE TABLE の出力が同一になります。これにより、エコシステムツールによる検証が簡素化されます。
以下の制限事項にご注意ください:
バイナリログレプリケーション:バイナリログを介したレプリケーションでは、IMCI 関連のコメントが binlog に含まれていないため、セカンダリデータベースで IMCI を再作成できません。セカンダリデータベース上で IMCI を作成するには、プライマリデータベースおよびセカンダリデータベースの両方で、同じ
allow_implicit_imci_alter_commentおよび関連するパラメータ設定を構成します。カスタム IMCI: カスタム IMCI は、これらの DDL ステートメントでは設定できません。IMCI をカスタマイズするには、「IMCI の拡張属性を使用して列指向インデックスをカスタマイズする」をご参照ください。