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

PolarDB:DDL 文を実行して IMCI を動的に作成および削除する

最終更新日:Jun 12, 2025

このトピックでは、テーブルの作成後に DDL 文を実行してインメモリ列インデックス (IMCI) を動的に作成および削除する方法について説明します。

前提条件

読み取り専用カラムストアノードをクラスターに追加し、クラスターエンドポイントを設定した後、クラスターエンドポイントを使用してクラスターに接続し、SQL 文を使用して IMCI を作成および管理できます。

  • 読み取り専用カラムストアノードが追加されています。 詳細については、「読み取り専用カラムストアノードを追加する」をご参照ください。

  • クラスターエンドポイントが設定されています。 手動および自動リクエスト分散ソリューションを使用して、リクエストをロウストアノードとカラムストアノードに分散できます。 ビジネス要件に基づいてリクエスト分散ソリューションを選択し、クラスターエンドポイントを設定できます。 詳細については、「リクエスト分散の概要」をご参照ください。

  • データベースクラスターは、クラスターエンドポイントを使用して接続されています。 詳細については、「クラスターに接続する」をご参照ください。

IMCI を作成する

  • 構文:

    • COMMENT 'COLUMNAR=1' フィールドを ALTER TABLE 文に追加して、テーブル全体に対して有効な IMCI を作成します。

    • COMMENT 'COLUMNAR=1' フィールドを ALTER TABLE ... MODIFY COLUMN ... 文に追加して、指定された列に対して有効な 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;
    
    -- テーブルに対して有効な IMCI を作成します。
    ALTER TABLE t5 COMMENT 'COLUMNAR=1';
    
    -- 指定された列に対して有効な IMCI を作成します。
    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 ... MODIFY COLUMN ... 文に追加して、指定された列に対して有効な 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' になります。

  • 例:

    -- 指定された列に対して有効な IMCI を作成します。
    CREATE TABLE t6(
      col1 INT COMMENT 'COLUMNAR=1',
      col2 DATETIME COMMENT 'COLUMNAR=1',
      col3 VARCHAR(200)
    ) ENGINE InnoDB;
    
    -- 指定された列に対して有効な IMCI を削除します。
    ALTER TABLE t6 MODIFY COLUMN col1 INT COMMENT 'COLUMNAR=0',
                   MODIFY COLUMN col2 DATETIME COMMENT 'COLUMNAR=0';
    
    -- テーブルに対して有効な IMCI を作成します。
    CREATE TABLE t7(
      col1 INT,
      col2 DATETIME,
      col3 VARCHAR(200)
    ) ENGINE InnoDB COMMENT 'COLUMNAR=1';
    
    -- テーブルに対して有効な IMCI を削除します。
    ALTER TABLE t7 COMMENT 'COLUMNAR=0';

IMCI 定義を変更する

  • 構文:

    • COMMENT 'COLUMNAR=1' フィールドを ALTER TABLE ... MODIFY COLUMN ... 文に追加して、IMCI に列を追加します。

    • COMMENT 'COLUMNAR=0' フィールドを ALTER TABLE ... MODIFY COLUMN ... 文に追加して、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;
    
    -- IMCI が有効な列を追加します。
    ALTER TABLE t8 MODIFY COLUMN col3 VARCHAR(200) COMMENT 'COLUMNAR=1';
    
    -- IMCI が有効な列を削除します。
    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 col7 VARCHAR(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'

前の例では、IMCI は col7 列に対して無効です。

ただし、InnoDB オンライン DDL の実装により、前の例の ALTER TABLE t9 COMMENT 'COLUMNAR=1', MODIFY COLUMN col7 VARCHAR(200) COMMENT 'COLUMNAR=0'; 文はオンライン再構築モードで実装されます。 これにより、パフォーマンスが低下します。 次の方法を試すことができます。

-- IMCI が無効な列の COMMENT フィールドを変更します。
ALTER TABLE t9 MODIFY COLUMN col7 VARCHAR(200) COMMENT 'COLUMNAR=0';

-- テーブルの COMMENT フィールドを変更して、テーブルに対して有効な IMCI を作成します。
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';

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 を有効にできます。 INSTANT DDL を有効にした後、読み取り専用ロウストアノードでの 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 以降の場合

    IMCI が有効なテーブルで列を作成および削除するときに、デフォルトで INSTANT DDL 文が使用されます。 この機能は、元の再構築モードと互換性がありません。 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 クエリを実行すると、読み取り専用カラムストアノードが使用されます。