开发者社区 问答 正文

如何使用CREATE INDEX数据定义语言

索引是创建在表上的,对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度,降低数据库系统的性能开销。
OceanBase中,新创建的索引需要等待一次每日合并后,才生效。
格式 CREATE [UNIQUE] INDEX indexname
    ON tblname (index_col_name,…)
    [index_type][index_options];

index_type:
    USING BTREE

index_options:
    index_option [index_option…]

index_option:
    GLOBAL [LOCAL]
    | COMMENT 'string'
    | COMPRESSION [=] '{NONE | LZ4_1.0 | LZO_1.0 | SNAPPY1.0 | ZLIB_1.0}'
    | BLOCK_SIZE [=] size
    | STORING(columname_list)
    | index_using_algorithm

columname_list:
    colname [, colname…]

index_col_name:
     colname [ASC | DESC]


  • index_col_name中,每个列名后都支持ASC(升序)和DESC(降序)。默认就为升序。

  • 本语句建立索引的排列方式为:首先以index_col_name中第一个列的值排序;该列值相同的记录,按下一列名的值排序;以此类推。

  • 执行“SHOW INDEX FROM tblname”可以查看创建的索引。

  • “index_option”中,可以指定GLOBAL,LOCAL关键字,表述全局或局部索引。默认是GLOBAL index. 创建带有Parition的表时index一定要加LOCAL关键字。如果没有加,系统将报错。多个index option以空格分隔。

  • 使用可选字段STORING,表示索引表中冗余存储某些列,以提高系统查询系统。(为OceanBase数据库特有)

说明: OceanBase内部数据以b树为索引。

举例 Oceanbase>CREATE TABLE test (c1 int primary key, c2 varchar(10));
Query OK, 0 rows affected (0.10 sec)

Oceanbase>create index test_index on test(c1, c2 desc) using hash;
Query OK, 0 rows affected (0.04 sec)

Oceanbase>show index from test;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------+---------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment     | Index_comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------+---------------+
| test  |          0 | PRIMARY    |            1 | c1          | A         |        NULL | NULL     | NULL   |      | BTREE      | available   |               |
| test  |          1 | test_index |            1 | c1          | A         |        NULL | NULL     | NULL   |      | BTREE      | unavailable |               |
| test  |          1 | test_index |            2 | c2          | A         |        NULL | NULL     | NULL   | YES  | BTREE      | unavailable |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------+---------------+
3 rows in set (0.00 sec)

展开
收起
云栖大讲堂 2017-11-01 15:44:18 1994 分享 版权
阿里云 AI 助理回答

在OceanBase数据库中,创建索引的过程和语法与您提供的信息基本一致。这里有几个关键点需要注意:

  1. 索引类型:虽然您的示例中使用了USING HASH,但根据OceanBase的官方文档,其内部主要采用B树作为索引结构,因此更常见的应该是使用USING BTREE。如果您的示例是为了说明其他数据库系统中的多样性,请忽略此条注释。

  2. 索引生效时间:您提到新创建的索引需要等待一次每日合并后才生效。这实际上是旧的信息。在最新的OceanBase版本中,索引创建后通常很快就可以被查询优化器所用,无需等待特定的合并周期。不过,索引的全局可见性和数据的一致性可能仍需依赖于事务的提交和系统的一些后台处理过程。

  3. 索引选项

    • GLOBALLOCAL:对于分区表,使用LOCAL关键字创建的索引将每个分区的索引独立存储,这可以减少索引的大小并提高维护效率。默认情况下,如果不指定,创建在分区表上的索引会是GLOBAL,意味着索引跨越所有分区。
    • STORING:允许在索引中直接存储额外列的数据,这样在某些查询场景下可以直接从索引中获取所需数据而无需回表,从而提升查询性能。
  4. 查看索引:通过SHOW INDEX FROM tblname;命令可以查看表上已创建的所有索引及其属性,包括是否唯一、索引名、列顺序、列名、排序方式等。

  5. 索引状态:在您的示例输出中,test_index的Comment字段显示为unavailable,这可能表示索引创建后尚未完全就绪或因某种原因不可用。在实际操作中,索引创建后应尽快变为available状态以供查询优化器使用。

  6. 注意事项:创建索引时应考虑索引对写入性能的影响,因为索引维护会增加插入、更新和删除操作的成本。同时,合理选择索引列和索引类型,以及适时地分析和优化索引,对于保持数据库的良好性能至关重要。

如果您有具体关于如何在OceanBase中高效管理索引、监控索引状态或优化查询性能的问题,欢迎继续提问。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: