このトピックでは、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 INDEX、SHOW COLUMNAR OFFSET、SHOW 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を作成するために使用される構文:
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 COLUMN
、ALTER COLUMN SET DEFAULT
、ALTER COLUMN DROP DEFAULT
、CHANGE COLUMN
、DROP 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を削除できます。