このトピックでは、テーブルの作成後にDDLステートメントを実行して、インメモリ列インデックス (IMCI) を動的に作成および削除する方法について説明します。
前提条件
読み取り専用列ストアノードを追加してクラスターエンドポイントを設定したら、クラスターエンドポイントを使用してクラスターに接続し、CREATE TABLEステートメントを実行してIMCIを作成および管理できます。
読み取り専用列ストアノードが追加されました。 詳細については、「読み取り専用列ストアノードの追加」をご参照ください。
クラスターエンドポイントが設定されています。 手動および自動の要求配信ソリューションを使用して、行ストアおよび列ストアノードに要求を配信できます。 ビジネス要件に基づいてリクエスト配布ソリューションを選択し、クラスターエンドポイントを設定できます。 詳細については、「リクエストの配布」をご参照ください。
データベースクラスターは、クラスターエンドポイントを使用して接続されています。 詳細については、「クラスターへの接続」をご参照ください。
IMCIの作成
構文:
COMMENT 'COLUMNAR=1 'フィールドをALTER TABLEステートメントに追加して、テーブル全体で有効なIMCIを作成します。
COMMENT'COLUMNAR=1 'フィールドをALTER TABLEに追加します。 変更されたコラム... 指定された列に有効なIMCIを作成するための文。
説明データ管理 (DMS) を使用してクラスターが接続されている場合、ロックフリースキーマ変更プロセスを使用してCOMMENTフィールドを変更しないことを推奨します。
PolarDB For MySQL 8.0.1.1.25以降の場合、IMCIはBLOBおよびTEXTデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.28以降の場合、IMCIはENUMデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.29以降の場合、パーティションテーブルにIMCIを作成できます。
PolarDB For MySQL 8.0.1.1.30以降の場合、IMCIはBIT、JSON、およびGeoデータ型をサポートします。
IMCIはSETデータ型をサポートしていません。
テーブルまたは列に既にコメントがある場合は、
COLUMNAR=1
をコメントに追加できます。 コメントの内容の前にCOLUMNAR=1
を追加することを推奨します。 たとえば、元のコメントがcomment 'abc' の場合、COLUMNAR=1
を追加した後の最後のコメントはCOMMENT 'COLUMNAR=1abc' です。
例:
CREATE TABLE t5( col1 INT, col2 DATETIME, col3 VARCHAR(200) ) ENGINE InnoDB; -- Create an IMCI valid for a table. ALTER TABLE t5 COMMENT 'COLUMNAR=1'; -- Create an IMCI valid for specified columns. ALTER TABLE t5 MODIFY COLUMN col1 INT COMMENT 'COLUMNAR=1', MODIFY COLUMN col2 DATETIME COMMENT 'COLUMNAR=1';
IMCIの削除
構文:
COMMENT 'COLUMNAR=0 'フィールドをALTER TABLEステートメントに追加して、テーブル全体に有効なIMCIを削除します。
COMMENT 'COLUMNAR=0 'フィールドをALTER TABLEに追加... 変更されたコラム... 指定された列に有効なIMCIを削除するステートメント。
説明PolarDB For MySQL 8.0.1.1.25以降の場合、IMCIはBLOBおよびTEXTデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.28以降の場合、IMCIはENUMデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.29以降の場合、パーティションテーブルにIMCIを作成できます。
PolarDB For MySQL 8.0.1.1.30以降の場合、IMCIはBIT、JSON、およびGeoデータ型をサポートします。
IMCIはSETデータ型をサポートしていません。
テーブルまたは列に既にコメントがある場合は、
COLUMNAR=0
をコメントに追加できます。 コメントの内容の前にCOLUMNAR=0
を追加することを推奨します。 たとえば、元のコメントがcomment 'abc' の場合、COLUMNAR=0
を追加した後の最後のコメントはCOMMENT 'COLUMNAR=0abc' です。
例:
-- Create an IMCI valid for specified columns. CREATE TABLE t6( col1 INT COMMENT 'COLUMNAR=1', col2 DATETIME COMMENT 'COLUMNAR=1', col3 VARCHAR(200) ) ENGINE InnoDB; -- Delete an IMCI valid for specified columns. ALTER TABLE t6 MODIFY COLUMN col1 INT COMMENT 'COLUMNAR=0', MODIFY COLUMN col2 DATETIME COMMENT 'COLUMNAR=0'; -- Create an IMCI valid for a table. CREATE TABLE t7( col1 INT, col2 DATETIME, col3 VARCHAR(200) ) ENGINE InnoDB COMMENT 'COLUMNAR=1'; -- Delete an IMCI valid for a table. ALTER TABLE t7 COMMENT 'COLUMNAR=0';
IMCI定義の変更
構文:
COMMENT'COLUMNAR=1 'フィールドをALTER TABLEに追加します。 変更されたコラム... IMCIに列を追加するための文。
COMMENT 'COLUMNAR=0 'フィールドをALTER TABLEに追加... 変更されたコラム... IMCIが有効な列を削除するための文。
説明PolarDB For MySQL 8.0.1.1.25以降の場合、IMCIはBLOBおよびTEXTデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.28以降の場合、IMCIはENUMデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.29以降の場合、パーティションテーブルにIMCIを作成できます。
PolarDB For MySQL 8.0.1.1.30以降の場合、IMCIはBIT、JSON、およびGeoデータ型をサポートします。
IMCIはSETデータ型をサポートしていません。
テーブルまたは列に既にコメントがある場合は、
COLUMNAR=1
またはCOLUMNAR=0
をコメントに追加できます。 コメントの内容の前にCOLUMNAR=1
またはCOLUMNAR=0
を追加することを推奨します。 たとえば、元のコメントがcomment 'abc' の場合、COLUMNAR=1
を追加した後の最後のコメントはCOMMENT 'COLUMNAR=1abc' です。
例:
CREATE TABLE t8( col1 INT COMMENT 'COLUMNAR=1', col2 DATETIME COMMENT 'COLUMNAR=1', col3 VARCHAR(200) ) ENGINE InnoDB; -- Add a column for which the IMCI is valid. ALTER TABLE t8 MODIFY COLUMN col3 VARCHAR(200) COMMENT 'COLUMNAR=1'; -- Delete a column for which the IMCI is valid. ALTER TABLE t8 MODIFY COLUMN col2 DATETIME COMMENT 'COLUMNAR=0';
複数の列に有効なIMCIを作成する
複数の列を含むテーブルは、OLAPサービスに含まれることがよくあります。 COMMENTフィールドを使用して、複数の列を含むテーブルに有効なIMCIを作成するプロセスを簡素化できます。 既定では、IMCIはテーブルでサポートされているデータ型のすべての列に対して有効です。 IMCIが有効でない列をいくつか指定することもできます。
PolarDB For MySQL 8.0.1.1.25以降の場合、IMCIはBLOBおよびTEXTデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.28以降の場合、IMCIはENUMデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.29以降の場合、パーティションテーブルにIMCIを作成できます。
PolarDB For MySQL 8.0.1.1.30以降の場合、IMCIはBIT、JSON、およびGeoデータ型をサポートします。
IMCIはSETデータ型をサポートしていません。
テーブルまたは列に既にコメントがある場合は、
COLUMNAR=1
をコメントに追加できます。 コメントの内容の前にCOLUMNAR=1
を追加することを推奨します。 たとえば、元のコメントがcomment 'abc' の場合、COLUMNAR=1
を追加した後の最後のコメントはCOMMENT 'COLUMNAR=1abc' です。
たとえば、次のステートメントを実行してテーブルを作成できます。
CREATE TABLE t9(
col1 INT, col2 INT, col3 INT,
col4 DATETIME, col5 TIMESTAMP,
col6 CHAR(100), col7 VARCHAR(200),
col8 TEXT, col9 BLOB
) ENGINE InnoDB;
次のステートメントを実行して、テーブルに有効なIMCIを作成できます。
ALTER TABLE t9 COMMENT'COLUMNAR=1 '、MODIFY COLUMN col7VARCHAR (200) COMMENT'COLUMNAR=0';
サンプル結果:
SHOW CREATE TABLE t9 FULL\G
*************************** 1. row ***************************
Table: t9
Create Table: CREATE TABLE `t9` (
`col1` int(11) DEFAULT NULL,
`col2` int(11) DEFAULT NULL,
`col3` int(11) DEFAULT NULL,
`col4` datetime DEFAULT NULL,
`col5` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`col6` char(100) DEFAULT NULL,
`col7` varchar(200) DEFAULT NULL COMMENT 'COLUMNAR=0',
`col8` text,
`col9` blob,
COLUMNAR INDEX (`col1`,`col2`,`col3`,`col4`,`col5`,`col6`,`col8`,`col9`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'COLUMNAR=1'
上記の例では、col7列ではIMCIは無効です。
ただし、InnoDB Online DDL実装により、前述の例のALTER TABLE t9 COMMENT 'COLUMNAR=1 ', MODIFY COLUMN col7 VARCHAR(200) COMMENT 'COLUMNAR=0';
ステートメントは、オンライン再構築モードで実装されます。 この結果、性能が低下する。 次の方法を試すことができます。
-- Modify the COMMENT field for the column for which the IMCI is invalid.
ALTER TABLE t9 MODIFY COLUMN col7 VARCHAR(200) COMMENT 'COLUMNAR=0';
-- Modify the COMMENT field for the table to create the IMCI that is valid for the table.
ALTER TABLE t9 COMMENT 'COLUMNAR=1';
列を追加するときにIMCIを作成する
ALTER TABLE ADD COLUMNステートメントを実行して列を追加すると、COMMENT 'COLUMNAR=1 'フィールドを追加して、列に有効なIMCIを作成できます。
PolarDB For MySQL 8.0.1.1.25以降の場合、IMCIはBLOBおよびTEXTデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.28以降の場合、IMCIはENUMデータ型をサポートします。
PolarDB For MySQL 8.0.1.1.29以降の場合、パーティションテーブルにIMCIを作成できます。
PolarDB For MySQL 8.0.1.1.30以降の場合、IMCIはBIT、JSON、およびGeoデータ型をサポートします。
IMCIはSETデータ型をサポートしていません。
テーブルまたは列に既にコメントがある場合は、
COLUMNAR=1
をコメントに追加できます。 コメントの内容の前にCOLUMNAR=1
を追加することを推奨します。 たとえば、元のコメントがcomment 'abc' の場合、COLUMNAR=1
を追加した後の最後のコメントはCOMMENT 'COLUMNAR=1abc' です。
たとえば、次のステートメントを実行してテーブルを作成し、col1列とcol2列に有効なIMCIを作成できます。
CREATE TABLE t10(
col1 INT COMMENT 'COLUMNAR=1',
col2 DATETIME COMMENT 'COLUMNAR=1',
col3 VARCHAR(200)
) ENGINE InnoDB;
次のステートメントを実行して、IMCIも有効なcol4列をt10
テーブルに追加できます。
ALTER TABLE t10 ADD col4 DATETIME DEFAULT NOW() COMMENT 'COLUMNAR=1';
IMCIへの変更を伴うため、INSTANT DDLステートメントではなくなりました。 このDDLステートメントは、列を追加するときに古いIMCIを削除し、col1、col2、およびcol4列に有効な新しいIMCIを作成します。
INSTANT DDLステートメントを実行してIMCIを作成および削除します
8.0.1.1.42および8.0.2.2.23より前のPolarDB For MySQLの場合
IMCIが有効なテーブルの列を作成および削除する場合、INSTANT DDLステートメントはデフォルトでは使用されません。 INSTANT DDLステートメントを使用して列を作成および削除する場合は、IMCIの構造を変更し、IMCIを再構築する必要があります。 IMCIが再構築されるとき、IMCIは依然として正常に使用することができる。
INSTANT DDLステートメントを使用する必要がある場合は、次のいずれかの方法を使用してINSTANT DDLを有効にできます。 読み取り専用の行ストアノードでのDDLステートメントの実行パフォーマンスは、INSTANT DDLを有効にしても影響を受けません。
データベースで次のステートメントを実行します。
SET imci_enable_add_column_instant_ddl = ON
PolarDBコンソールにログインします。 [パラメーター] ページで、
loose_imci_enable_add_column_instant_ddl
パラメーターをOnに設定します。
INSTANT DDLを有効にすると、列ストアノードで列を作成または削除すると、バックグラウンドでIMCIが非同期に作成されます。 テーブルに有効なIMCIは、IMCIが作成されるまで一時的に使用できません。
PolarDB For MySQL 8.0.1.1.42以降および8.0.2.2.23以降の場合
INSTANT DDLステートメントは、IMCIが有効なテーブルの列を作成および削除するときにデフォルトで使用されます。 この機能は、元の再構築モードと互換性がありません。
imci_enable_add_column_instant_ddl
パラメーターをOFFに設定し、テーブルにプライマリキーがあることを確認する必要があります。
IMCIの状態を表示する
IMCI機能を有効にすると、OLAPクエリ要求はプライマリノードではなく読み取り専用列ストアノードに配信されます。 これにより、OLAPおよびOLTPコンピューティングリソースが分離されます。 この分離により、IMCIを作成または変更するためのオンラインDDLステートメントは、非同期DDLステートメントとして最適化されます。 次のロジックが使用されます。プライマリノードでテーブルとIMCIのメタデータが変更された後、変更はRedoログを使用して読み取り専用列ストアノードに同期されます。 読み取り専用列ストアノードは、データディクショナリの変更が有効になった後、バックグラウンドスレッドを開始してIMCIを同時に作成します。
非同期DDLロジックは、DDLステートメントが送信され、データ辞書の変更が有効になりますが、IMCIは作成された後にのみ照会できることを意味します。 ただし、IMCIを作成する前に照会することはできません。 DDLステートメントが実行された直後にOLAPクエリを実行した場合、読み取り専用の行ストアノードは引き続き使用されます。 IMCIの作成後にOLAPクエリを実行すると、読み取り専用列ストアノードが使用されます。
まず、読み取り専用列ストアノードでINFORMATION_SCHEMA.IMCI_INDEXESステートメントを実行して、IMCIが作成されているかどうかを確認します。
たとえば、次のステートメントを実行してテーブルを作成できます。
CREATE TABLE t11(
col1 INT, col2 DATETIME, col3 VARCHAR(200)
) ENGINE InnoDB;
次のDDLステートメントを実行して、IMCIを作成できます。
ALTER TABLE t11 COMMENT 'COLUMNAR=1';
このDDLステートメントは、INSTANT DDLと同様であり、プライマリノードで迅速に実行されます。 この場合、次のステートメントをすぐに実行してクエリを実行すると仮定します。
SELECT * FROM INFORMATION_SCHEMA.IMCI_INDEXES WHERE TABLE_NAME = 't11';
パーティション分割テーブルでクエリを実行する場合は、ファジー一致を使用できます。 例
SELECT * FROM INFORMATION_SCHEMA.IMCI_INDEXES WHERE TABLE_NAME LIKE '% t1 %';
結果のSTATEフィールドがCOMMITTEDではなくRECOVERINGの場合、IMCIはまだ作成中です。 IMCIビルドの進行状況を表示する方法の詳細については、「IMCIのDDL実行速度とビルドの進行状況の表示」をご参照ください。
+--------+-----------+----------+--------+---------+------+----------+--------+
|TABLE_ID|SCHEMA_NAME|TABLE_NAME|NUM_COLS|PACK_SIZE|ROW_ID|STATE |MEM_SIZE|
+--------+-----------+----------+--------+---------+------+----------+--------+
| xxxx| test | t11 | 3| 65536| 0|RECOVERING| 0 |
+--------+-----------+----------+--------+---------+------+----------+--------+
STATEフィールドがCOMMITTEDに設定されている場合、IMCIは作成されています。 ここでOLAPクエリを実行すると、読み取り専用列ストアノードが使用されます。