すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DDLステートメントを実行してIMCIを動的に作成および削除する

最終更新日:Jul 03, 2024

このトピックでは、テーブルの作成後に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クエリを実行すると、読み取り専用列ストアノードが使用されます。