概述
索引是一种用于快速检索数据的数据结构。TDSQL Boundless 支持创建普通索引、唯一索引、全局二级索引(GSI)和多值索引(MVI),本文介绍创建索引的语法、参数及示例。
语法
# 方式一:使用 CREATE INDEX 语句CREATE [UNIQUE] INDEXindex_name ON tbl_name (key_part [, key_part ...])[GLOBAL [gsi_partition_option]][index_option][algorithm_option];# 方式二:使用 ALTER TABLE 语句ALTER TABLE tbl_name ADD{ [UNIQUE] {INDEX | KEY}| PRIMARY KEY}index_name (key_part [, key_part ...])[GLOBAL [gsi_partition_option]][index_option][algorithm_option];index_option: {| COMMENT 'string'| {VISIBLE | INVISIBLE}}algorithm_option:ALGORITHM [=] {DEFAULT | INPLACE | COPY}key_part:column_name [(length)] [ASC | DESC]| ((CAST(expr AS type ARRAY)))
参数说明
索引选项 (index_option)
COMMENT 'string':为索引添加注释说明VISIBLE | INVISIBLE:设置索引是否对优化器可见算法选项 (algorithm_option)
ALGORITHM [=] {DEFAULT | INPLACE | COPY}:指定创建索引的算法DEFAULT:由系统自动选择最优算法INPLACE:在线创建,不阻塞读写(推荐)COPY:拷贝表数据创建索引,默认不会阻塞读写操作索引列 (key_part)
column_name [(length)] [ASC | DESC]:对普通列建索引,可选前缀长度与排序方向((CAST(expr AS type ARRAY))):多值索引 (MVI),对 JSON 表达式 expr(例如 attributes->'$.tags')返回的数组建索引,需使用双括号;支持 UNIQUE 多值索引,以及多值索引列与普通列组合的复合索引GLOBAL [gsi_partition_option] 选项: 详见 全局二级索引。
注意:
多值索引本身不能声明为全局索引 (
GLOBAL),即 CREATE INDEX ... GLOBAL 不可用于多值索引,否则报错 ER_GLOBAL_INDEX_UNSUPPORTED;但表上其他列的全局索引可与本地多值索引共存。示例
创建普通索引与主键
# 创建测试表CREATE TABLE sbtest1 (id int, v1 int, v2 int, v3 int, v4 int);INSERT INTO sbtest1 VALUES(1, 10, 20, 30, 40), (2, 11, 21, 31, 41);# 在线添加主键(支持 ALGORITHM = COPY 在线操作)ALTER TABLE sbtest1 ADD PRIMARY KEY(id), ALGORITHM = COPY;# 查看表结构确认主键已生效SHOW CREATE TABLE sbtest1;# 显示设置索引 COMMENT,可见性和算法CREATE UNIQUE INDEX idx_v1 ON sbtest1 (v1) COMMENT 'v1_index' INVISIBLE ALGORITHM = INPLACE;ALTER TABLE sbtest1 ADD INDEX idx_v2 (v2) COMMENT 'v2_index' VISIBLE, ALGORITHM = INPLACE;# 默认使用 INPLACE 算法CREATE UNIQUE INDEX idx_v4 ON sbtest1 (v4);ALTER TABLE sbtest1 ADD INDEX idx_v3 (v3);
创建全局二级索引(GSI)
创建多值索引 (MVI)
# 准备含 JSON 列的表CREATE TABLE products (id BIGINT NOT NULL AUTO_INCREMENT,status INT NOT NULL DEFAULT 0,attributes JSON,PRIMARY KEY (id));# 多值索引 (MVI):对 JSON 数组建函数索引,需双括号CREATE INDEX idx_tags ON products ((CAST(attributes->'$.tags' AS CHAR(200) ARRAY)));# UNIQUE 多值索引:保证每个数组元素在表内唯一CREATE UNIQUE INDEX uk_tags ON products ((CAST(attributes->'$.tags' AS CHAR(200) ARRAY)));# 复合多值索引:普通列与多值索引列组合CREATE INDEX idx_status_tags ON products (status, (CAST(attributes->'$.tags' AS CHAR(200) ARRAY)));