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

PolarDB:CCIの作成と使用

最終更新日:Dec 16, 2024

このトピックでは、clustered columnary index (CCI) を作成および使用する方法について説明します。

サポートされているバージョン

PolarDB-Xインスタンスのバージョンは5.4.19-16989811以降である必要があります。 PolarDB-Xインスタンスのバージョンの詳細については、「リリースノート」および「インスタンスのバージョンの表示と更新」をご参照ください。

使用上の注意

  • CCIは、PolarDB-X 2.0 Enterprise Editionプライマリインスタンスでのみ作成できます。 詳細については、「CCI作成のガイドライン」をご参照ください。

  • CCIを作成するときは、次の制限に注意してください。

    • プレフィックスインデックスは使用できません。

    • CCIの名前を指定する必要があります。

    • 既定では、CCIはプライマリテーブルのすべての列を含み、プライマリテーブルの列に加えられたすべての変更を自動的に追跡してキャプチャします。 CCIの列を手動で変更することはできません。

    • CCIの作成時にローカルインデックスは作成されません。

    • CCIの定義のソートキーのLENGTHパラメーターは有効になりません。

  • プライマリインスタンス、読み取り専用インスタンス、および列型読み取り専用インスタンスは、SHOW columnar INDEXSHOW COLUMNAR OFFSETSHOW COLUMNAR STATUSなどのクエリステートメントをサポートしています。

  • CCIが作成されるテーブルに対してDDL操作を実行する際の制限については、このトピックの「制限」を参照してください。

構文

PolarDB-Xは、MySQLのDDLステートメントの構文を拡張します。 CCIを定義するために使用される次の構文が追加されます。 MySQLでインデックスを作成するのと同じ方法で構文を使用できます。

CREATE
    CLUSTERED COLUMNAR INDEX index_name    
    ON tbl_name (index_sort_key_name,...)    
    [partition_options]

# Syntax that defines partitioning options.
partition_options:
    PARTITION BY
          HASH({column_name | partition_func(column_name)})
        | KEY(column_list)
        | RANGE({column_name | partition_func(column_name)})
      	| RANGE COLUMNS(column_list)
        | LIST({column_name | partition_func(column_name)}) 
        | LIST COLUMNS(column_list)} }
    partition_list_spec

# Syntax that defines partitioning functions.
partition_func:
    YEAR
  | TO_DAYS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH

# Syntax that defines partitioning methods.
partition_list_spec:
    hash_partition_list
  | range_partition_list
  | list_partition_list

# Syntax that defines the hash/key partitioning method.
hash_partition_list:
    PARTITIONS partition_count

# Syntax that defines the range/range columns partitioning method.
range_partition_list:
    range_partition [, range_partition ...]

range_partition:
    PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]
    
# Syntax that defines the list or list columns partitioning method.
list_partition_list:
    list_partition [, list_partition ...]

list_partition:
    PARTITION partition_name VALUES IN (value_list) [partition_spec_options]

次のステートメントを実行して、t_orderという名前のテーブルを作成し、cc_i_sellerという名前のCCIをt_orderテーブルに作成します。

CREATE TABLE t_order (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext DEFAULT NULL,
  `order_detail` longtext DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `l_i_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by hash(`order_id`) partitions 16;
CREATE CLUSTERED COLUMNAR INDEX `cc_i_seller` ON t_order (`seller_id`) partition by hash(`order_id`) partitions 16;

t_orderテーブルでcc_i_seller CCIを作成するために使用される構文:

image
説明
  • CLUSTERED COLUMNAR: 作成するインデックスの型がCCIであることを指定するために使用されるキーワード。

  • プライマリテーブル: プライマリテーブルの名前。 この例では、t_orderテーブルがプライマリテーブルです。 テーブルは、order_id列に基づいてハッシュアルゴリズムを使用して分割されます。

  • CCI名: CCIの名前。 CCIは、SQL文でその名前で指定できます。

  • ソートキー: CCIファイル内のどのデータがソートされるかに基づくCCIのソートキー。

  • パーティショニング句: CREATE TABLE文のパーティショニング句の構文と同じ構文を持つCCIパーティショニング句。

  • CCI定義句: CLUSTERED COLUMNAR INDEX 'cc_i_seller 'ON t_order ('seller_id') partition by hash('order_id') partition 16

クエリでのCCIの使用

CCIの作成後、クエリのCCIを指定できます。

ヒントを使用してCCIを指定する

構文:

FORCE INDEX({index_name})

例:

SELECT a.*, b.order_id 
 FROM t_seller a 
   JOIN t_order b FORCE INDEX(cc_i_seller) ON a.seller_id = b.seller_id 
 WHERE a.seller_nick="abc";

特定のCCIを無視して使用する

説明

CCIが作成される複数のテーブルに対するクエリの場合、PolarDB-Xはコストが最も低いテーブルのCCIを自動的に選択します。 列内読み取り専用インスタンスのみがCCIベースのクエリをサポートしています。

特定のCCIを無視する (インデックスを無視)

構文:

IGNORE INDEX({index_name},...)

次のステートメントでは、cc_i_seller CCIを使用しないことを指定します。

SELECT t_order.id,t_order.order_snapshot FROM t_order IGNORE INDEX(cc_i_seller) WHERE t_order.seller_id = 's1';

特定のCCIを使用する (Use INDEX)

構文:

USE INDEX({index_name},...)

次のステートメントでは、cc_i_seller CCIを使用することを指定します。

SELECT t_order.id,t_order.order_snapshot FROM t_order USE INDEX(cc_i_seller) WHERE t_order.seller_id = 's1';

制限事項

説明

作成を使用してCCIを使用する場合は、次の制限に注意してください。

  • テーブルにCCIを作成するには、主キー、ソートキー、およびパーティションキーのデータ型が要件を満たしていることを確認します。 詳細については、このトピックの「データ型の制限」セクションを参照してください。

  • CCIが作成されたテーブルに対して実行できるのは、共通のDDL文だけです。 詳細については、このトピックの「DDLステートメントの制限」セクションを参照してください。

  • CCIが作成されている表でDDL文を使用して列のデータ型を変更する場合は、必ず対応するデータ型に変更してください。 詳細については、このトピックの「DDLステートメントの制限」セクションを参照してください。

データ型の制限

データ型

主キー

並べ替えキー

パーティションキー

Integer

ビット (署名なし)

必須

不可

TINYINT (署名なし)

SMALLINT (署名なし)

MEDIUMINT (署名なし)

INT (署名なし)

BIGINT (UNSIGNED)

日付と時刻

日付

日付時刻

TIMESTAMP

時間

必須

不可

YEAR

必須

不可

String

CHAR

VARCHAR

TEXT

必須

不可

BINARY

VARBINARY

BLOB

必須

不可

浮動小数点数

FLOAT

任意

不可

不可

DOUBLE

任意

不可

不可

DECIMAL

任意

不可

不可

NUMERIC

任意

不可

不可

特殊タイプ

JSON

任意

不可

不可

ENUM

任意

不可

不可

SET

任意

不可

不可

ポイント

任意

不可

不可

GEOMETRY

任意

不可

不可

説明

パーティショニングアルゴリズムは、異なるデータ型をサポートします。 詳細については、「CREATE TABLE (自動モード) 」トピックの「サポートされるデータ型」セクションをご参照ください。

DDLステートメントの制限

説明

次のステートメントを実行して、CCIが作成されるテーブルでDDLステートメントの実行を許可するかどうかを指定できます。

SET [GLOBAL] forbid_ddl_with_cci = [true | false];
  • 次の表は、CCIが作成されるテーブルでDDLステートメントがサポートされるかどうかを示しています。

    カテゴリ

    API 操作

    サンプルSQL文

    対応

    テーブル操作

    テーブルの削除

    ドロップテーブルtbl_name;

    テーブルをクリアする

    TRUNCATE TABLE tbl_name;

    テーブル名の変更

    • ALTER TABLE old_tbl_name RENAME TO new_tbl_name;

    • RENAME TABLE old_tbl_nameにnew_tbl_name;

    複数のテーブルの名前変更

    RENAME TABLE tbl_name_aからtbl_name_b、tbl_name_cからtbl_name_d;

    テーブルに列を追加する

    ALTER TABLE tbl_name ADD col_name TYPE;

    列の削除

    ALTER TABLE tbl_name DROP COLUMN col_name;

    列のデータ型を変更する

    ALTER TABLE tbl_name MODIFY col_name TYPE;

    列の名前変更 (変更)

    ALTER TABLE tbl_name CHANGE old_col new_col TYPE;

    列のデフォルト値を変更する

    • ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT default_value;

    • ALTER TABLE tbl_name ALTER COLUMN col_name DROP DEFAULT;

    テーブルをロックせずに列のデータ型を変更する

    ALTER TABLE tbl_name MODIFY col_name TYPE、ALGORITHM = omc;

    ALTER TABLEステートメントを使用して複数の操作を実行する

    ALTER TABLE tbl_name MODIFY col_name_a、DROP COLUMN col_name_b;

    列の作成

    -

    不可

    パーティションの変更

    -

    不可

    CCI操作

    CCIの作成

    • CLUSTERED COLUMNAR INDEX cci_name;

    • ALTER TABLE tbl_name ADD CLUSTERED COLUMNAR INDEX cci_name;

    CCIの削除

    • DROP INDEX cci_name ON TABLE tbl_name;

    • ALTER TABLE tbl_name DROPインデックスcci_name;

    CCIの名前を変更する

    ALTER TABLE tbl_name RENAME INDEX cci_name_a TO cci_name_b;

    CCIにパーティションを追加する

    ALTER TABLE 'tbl_name'.'cci_name' ADD PARTITION;

    CCIパーティションへのその他の変更

    -

    不可

  • ALTER TABLEステートメントを使用して、CCIが作成されているテーブルの列を変更する場合は、制限事項に注意してください。 次の表に制限を示します。

    条項

    主キーの変更

    CCIのパーティションキーの変更

    ソートキーの変更

    コラムを追加

    不可

    非該当

    非該当

    ALTER COLUMN SET DEFAULTおよびALTER COLUMN DROP DEFAULT

    任意

    不可

    不可

    コラムを変更する

    任意

    不可

    不可

    ドロップコラム

    任意

    不可

    不可

    変更コラム

    任意

    不可

    不可

    説明

    ADD COLUMNALTER COLUMN SET DEFAULTALTER COLUMN DROP DEFAULTCHANGE COLUMNDROP COLUMN、およびMODIFY COLUMN文を使用して、プライマリテーブルまたはCCIのプライマリキー列、パーティションキー列を除くすべての列を管理できます。

  • MODIFY/CHANGE COLUMN文を使用して、CCIが作成されている表の列のデータ型を変更するには、必ず対応するデータ型に変更してください。

    サポートされるデータ型

    サポートされていないデータ型

    • 整数: BIT (UNSIGNED) 、TINYINT (UNSIGNED) 、SMALLINT (UNSIGNED) 、MEDIUMINT (UNSIGNED) 、INT (UNSIGNED) 、およびBIGINT (UNSIGNED)

    • 日付と時刻: DATETIME

    • 浮動小数点数: FLOAT、DOUBLE、DECIMAL、およびNUMERIC

    • 文字列: CHARおよびVARCHR

    • 文字列: TEXT、BINARY、VARBINARY、BLOB

    • 日付と時刻: タイムスタンプ、時間、および年

    • タイプを指定する: JSON、ENUM、SET、POINT、およびGEOMETRY

    説明

    列をサポートされていないデータ型に変更する場合は、DROP INDEX文を使用してCCIを削除し、列のデータ型を変更してから、CCIを再作成できます。

  • ALTER table文を使用して、CCIが作成されたテーブルのインデックスを変更できるかどうかを次の表に示します。

    ステートメント

    対応

    ALTER TABLE ADD PRIMARYキー

    ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] キー

    ALTER TABLEドロップインデックス

    ALTER TABLE DROP FOREIGNキーfk_symbol

    ALTER TABLE DROP PRIMARYキー

    不可

    ALTER TABLE RENAME INDEX

    CCIの名前を変更できます。

    ALTER TABLE ALTER INDEX index_name {VISIBLE | INVISIBLE}

    CCIを変更できません。

    ALTER TABLE {DISABLE | ENABLE} KEYS

    CCIを変更できません。

よくある質問

  • ソートキーを指定せずにCCIを作成できますか?

    いいえ。 CREATE CLUSTERED COLUMNAR INDEXステートメントを使用してCCIを作成する場合は、ソートキーを明示的に指定する必要があります。 ソートキーとパーティションキーは異なる列にすることができます。 例: t_orderテーブルにCCIを作成する場合、seller_id列をソートキーとして、order_id列をパーティションキーとして指定できます。

  • パーティションキーを指定せずにCCIを作成できますか?

    はい。 パーティションキーを指定しない場合、プライマリキーはパーティションキーとして機能し、ハッシュパーティション分割方法が使用されます。

  • CCI作成の進捗状況を表示するにはどうすればよいですか?

    DDLステートメントを使用して、CCIの現在のステータスとDDLタスクの進行状況を表示できます。 詳細については、「SHOW COLUMNAR INDEX」および「SHOW DDL」をご参照ください。

  • 既存のCCIを削除するにはどうすればよいですか?

    DROP INDEXステートメントを使用して、既存のCCIを削除できます。