创建索引
本文将向您介绍如何使用 SQL 语句来创建索引,同时介绍创建索引的前提条件、索引简介、限制和建议等,并提供一些示例。
本文主要介绍使用 CREATE INDEX 语句创建索引,多值索引除外。多值索引仅支持在创建表时创建。其他创建索引的方式请参见CREATE TABLE 或 ALTER TABLE 语句。
索引简介
索引也叫二级索引,是一种可选的表结构。seekdb 采用的是聚集索引表模型,对于用户指定的主键,系统会自动生成主键索引,而对于用户创建的其他索引,则是二级索引。您可以根据自身业务需要来决定在哪些字段上创建索引,以便加快在这些字段上的查询速度。
更多有关 seekdb 索引的信息,请参见 索引简介。
前提条件
在创建索引前,您需要确认以下事项:
-
您已部署 seekdb。更多有关部署 seekdb 的信息,请参见 部署概述。
-
您已连接到 seekdb。更多连接数据库的信息,请参见 连接方式概述。
-
您已创建数据库。更多有关创建数据库的信息,请参见 创建数据库。
-
您已创建表。更多有关创建表的信息,请参见 创建表。
-
您已拥有
INDEX权限。查看当前用户权限的相关操作请参见 查看用户权限。如果不具备该权限,请联系管理员为您授权,用户授权的相关操作请参见 直接授予权限。
创建索引的限制
-
在 seekdb 中,索引名称必须在数据库(DataBase)的范围内保证唯一。
-
索引名称的长度不能超过 64 字节。
-
唯一索引使用限制:
-
在一个表中可以创建多个唯一索引,但是每个唯一索引所对应的列值都必须保持唯一。
-
如果除了主键之外,还希望其他列的组合满足全局唯一性的要求,需要使用全局唯一索引来实现。
-
在使用局部唯一索引时,索引必须包含表的分区函数中的所有列。
-
-
在使用全局索引时,全局索引的分区规则不一定需要与表的分区规则完全相同或一致。
-
空间索引使用限制:
-
空间索引仅支持局部索引,不支持全局索引。
-
创建空间索引的列必须定义为
SRID属性,否则,在该列上添加的空间索引在后续查询时会无法生效。关于SRID相关的介绍,请参见 空间参考系统(SRS)。 -
只能对空间数据类型的数据列创建空间索引。seekdb 支持的空间数据类型请参见 空间数据类型概述。
-
创建空间索引的列的列属性必须为
NOT NULL。如果不为NOT NULL,您也可以通过ALTER TABLE语句先将该列的列属性修改为NOT NULL后再添加空间索引。修改列属性的具体操作可参见 定义列的约束类型。 -
seekdb 暂不支持通过
ALTER TABLE来修改列的SRID属性,因此需要建表的时候定义好空间列的SRID属性,才能让空间索引生效。
-
-
全文索引使用限制及注意事项
非分区表和分区表上有无主键都可以创建全文索引,创建全文索引限制如下:
- 全文索引仅支持应用于
CHAR、VARCHAR和TEXT类型的列。 - 当前版本只支持创建局部(
LOCAL)全文索引。 - 创建全文索引时不可以指定
UNIQUE关键字。 - 如果要创建涉及多列的全文索引,则必须确保这些列具有相同的字符集。
- 全文索引仅支持应用于
创建索引的建议
-
建议使用能够简洁地描述索引所涵盖的列和用途的名称,例如,
idx_customer_name。更多命名信息,请参见 对象命名规范综述。 -
如果全局索引的分区规则和主表的分区规则相同并且分区数相同,建议创建一个局部索引。
-
建议并行下发创建索引的 SQL 语句条数,不要超过 seekdb 的核数上限。例如,seekdb 规格为 4 核(4C),则建议并发创建索引不超过 4 条。
-
对经常更新的表要避免对其进行过多的索引,对经常用于查询的字段应该创建索引。
-
数据量小的表建议不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
-
当修改性能远远大于检索性能时,不建议创建索引。
-
创建高效索引:
-
索引要全部包含所需查询的列,包含的列越全越好,这样可以尽可能的减少回表的行数。
-
等值条件永远放在最前面。
-
过滤与排序数据量大的放前面。
-
使用命令行创建索引
请使用 CREATE INDEX 语句创建索引。
您可以使用 SHOW INDEX FROM table_name; 语句查看表中索引的信息,其中 table_name 为表名。