暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分区表的索引

SQL新手 2022-12-08
847

分区表的查询性能跟 SQL 中条件有关。当 SQL 中带上拆分键时,OceanBase 会根据条件做分区裁剪,只用搜索特定的分区即可;如果没有拆分键,则要扫描所有分区。

背景信息

分区表也可以通过创建索引来提升性能。跟分区表一样,分区表的索引也可以分区或者不分区。

  • 如果分区表的索引不分区,就是一个全局索引(GLOBAL),是一个独立的分区,索引数据覆盖整个分区表。

  • 如果分区表的索引分区了,根据分区策略又可以分为两类。一是跟分区表保持一致的分区策略,则每个索引分区的索引数据覆盖相应的分区表的分区,这个索引又叫本地索引(LOCAL)。 二是作为 GLOBAL 索引可以有自己独立的分区方式。

建议尽可能的使用本地索引,只有在有必要的时候才使用全局索引。其原因是全局索引会降低 DML 的性能,DML 可能会因此产生分布式事务。

通常创建索引时默认都是本地索引,全局索引需要在后面增加关键字 GLOBAL。

语法

CREATE [UNIQUE] INDEX index_name 
     ON table_name (index_col_name,...) 
      [index_type] [index_options] 
      [partition_option]

index_type: 
      USING BTREE

index_options: 
      index_option [index_option...]
      
index_option: 
    GLOBAL | LOCAL
    | COMMENT 'string'
    | COMPRESSION [=] {NONE | LZ4_1.0 | LZO_1.0 | SNAPPY_1.0 | ZLIB_1.0}
    | BLOCK_SIZE [=] size
    | STORING(column_name_list) 
    | VISIBLE | INVISIBLE

index_col_name: 
    column_name [(length)] [ASC | DESC]

column_name_list: 
    column_name [, column_name...]

参数解释

参数描述
index_name指定要创建的索引名称。
table_name指定索引所属的表名。
index_col_name指定索引的列名,每个列名后都支持 ASC(升序),不支持 DESC(降序)。默认为升序。
建立索引的排序方式为:首先以 index_col_name 中第一个列的值排序;该列值相同的记录,按下一列名的值排序;以此类推。
column_name用于创建索引的列名。
length对于字符串列,可以使用 col_name(length) 语法截取字符串的部分用于创建索引。
支持的数据类型有 CHARVARCHARBINARY 与 VARBINARY
index_type索引类型,只支持 USING BTREE,表示使用 B-Tree 索引。
UNIQUE指定为唯一索引。
index_option指定索引选项,多个 index_option 以空格分隔。
GLOBAL | LOCAL指定该索引是全局索引或局部索引,默认是 LOCAL
COMMENT指定注释。
COMPRESSION指定压缩算法。
BLOCK_SIZE指定微块大小。
STORING表示索引表中冗余存储某些列,以提高系统查询性能。

示例

创建分区表的本地索引。

  1. 创建 t_log_part_by_range_hash 表。

    CREATE TABLE t_log_part_by_range_hash (log_date int primary key) ;
    
  2. 创建分区表的本地索引 idx_log_date

    CREATE INDEX idx_log_date ON t_log_part_by_range_hash(log_date);
    
  3. 查看已创建的分区索引 idx_log_date

    obclient> SHOW INDEX FROM t_log_part_by_range_hash;
    +--------------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
    | Table                    | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment   | Index_comment | Visible |
    +--------------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
    | t_log_part_by_range_hash |          0 | PRIMARY      |            1 | log_date    | A         |        NULL | NULL     | NULL   |      | BTREE      | available |               | YES     |
    | t_log_part_by_range_hash |          1 | idx_log_date |            1 | log_date    | A         |        NULL | NULL     | NULL   |      | BTREE      | available |               | YES     |
    +--------------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
    2 rows in set
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论