创建索引

最近更新时间:2026-02-05 11:01:13

我的收藏

概述

索引是对数据的排序,TDSQL Boundless 使用索引快速定位数据。本章节给出创建索引的语法和示例。
TDSQL Boundless 创建二级索引默认为在线操作,不会阻塞对表的读写。有关 Online DDL 的详细说明,请参考 Online DDL 说明

对已有表创建索引

# 方式一:使用 CREATE INDEX 语句
CREATE [UNIQUE] INDEX
index_name ON tbl_name (column_names)
[index_option]
[algorithm_option];

# 方式二:使用 ALTER TABLE 语句
ALTER TABLE tbl_name ADD
{ [UNIQUE] {INDEX | KEY}
| PRIMARY KEY
}
index_name (column_names)
[index_option]
[algorithm_option];

index_option: {
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
}

algorithm_option:
ALGORITHM [=] {DEFAULT | INPLACE | COPY}
参数说明
索引选项 (index_option)
COMMENT 'string':为索引添加注释说明
VISIBLE | INVISIBLE:设置索引是否对优化器可见
算法选项 (algorithm_option)
ALGORITHM [=] {DEFAULT | INPLACE | COPY}:指定创建索引的算法
DEFAULT:由系统自动选择最优算法
INPLACE:在线创建,不阻塞读写(推荐)
COPY:拷贝表数据创建索引,默认不会阻塞读写操作
使用示例
# 创建测试表
CREATE TABLE sbtest1 (id int, v1 int, v2 int, v3 int, v4 int);

# 截止迭代21.2.3,暂不支持online add pk
ALTER TABLE sbtest1 ADD PRIMARY KEY(id), ALGORITHM = COPY;
ERROR 8528 (HY000): Online alter table tdsql.sbtest1 failed with 'Not support table without primary key', please set variable 'tdsql_use_online_copy_ddl' to 'false' if no write during alter is acceptable.

# 显示设置索引 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);

新建表的同时创建索引

详细请参见 创建表

大数据量表创建索引使用建议

TDSQL Boundless 的 Fast Online DDL 能力,通过并行处理和旁路写入相结合,使得 DDL 操作变得更加高效和便捷。
但如果我们没有正确地划分大/小表,或者没有根据数据规模进行适当的分区,那么 Fast Online DDL 的执行效率可能会大打折扣。这是因为一张大表,在没有进行适当分区的情况下,数据很可能都集中在单个节点上,因此 DDL 操作也会在单个节点上进行,而不是在多个节点上并行执行,这将大大降低执行效率。
只有根据数据规模合理地使用分区表,才能充分运用 Fast Online DDL 的分布式可扩展性能。
创建分区建议:
1. TDSQL Boundless 100% 兼容原生 MySQL 分区表语法,支持一/二级分区,主要用于解决:(1)大表的容量问题;(2)高并发访问的性能问题。
2. 大表的容量问题:如果单表大小预期未来将超过实例单节点数据盘大小,建议创建一级 hash 或 key 分区将数据均匀打散到多个节点上;如果未来数据量再增大,可通过弹性扩容的方式不断“打薄”磁盘水位。
3. 高并发访问的性能问题:高并发访问 TP 业务,如果预计单节点性能无法扛住超量读写压力的时候,也建议创建一级 hash 或 key 分区将读写压力均匀打散到多个节点上。
4. 第2、第3点中创建的分区表,建议结合业务特点选择能满足大部分核心业务查询的字段作为分区键,分区数建议为实例节点数量的倍数。
5. 如果有数据清理的需求,可创建 RANGE 分区表使用 truncate partition 命令进行快速数据清理;如果要兼顾数据打散,可进一步创建二级分区为 HASH 的分区表。