创建部分索引

您可以在创建分区表的同时创建部分索引在已创建好的分区表上创建部分索引

创建分区表的同时创建部分索引

语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
    [(create_definition,...)]
    [table_options]
    partition_options
     ...

其中,create_definition为:

{
    col_name column_definition
  | {INDEX | KEY} [index_name] [index_type] (key_part,...)
      [index_option] [partial_partition_option]
      ...
}

partial_partition_option为:

([PARTITION partition_name0[(SUBPARTITION subpartition_name0[, ...])]][,...]
 )

语法中的其他参数详情请参见CREATE TABLE

参数说明

参数

说明

table_name

表名。

col_name

列名。

partition_name0

一级分区名称。

说明

您可以设置多个一级分区,多个分区名称之间使用英文逗号(,)分隔。

subpartition_name0

二级分区名称。

说明

您可以设置多个二级分区,多个分区名称之间使用英文逗号(,)分隔。

示例

  • 在一级分区上创建部分索引。

    创建分区表orders,在12月的orders_202212分区上创建部分索引o_ind_dp(dept_no, part_no),而在其他历史分区上创建部分索引o_ind_amout(amount, order_id)

    CREATE TABLE orders
    (
      order_id    INT,
      dept_no     INT,
      part_no     INT,
      country     varchar(20),
      date        DATE,
      amount      INT,
      Primary Key(order_id),
      KEY o_ind_dp(dept_no, part_no) (partition orders_202212),
      KEY o_ind_amout(amount, order_id) 
       (partition orders_202201,
        partition orders_202202,
        partition orders_202203,
        partition orders_202204,
        partition orders_202205,
        partition orders_202206,
        partition orders_202207,
        partition orders_202208,
        partition orders_202209,
        partition orders_202210,
        partition orders_202211
       )
    )
    PARTITION BY RANGE(month(date))
    (
      PARTITION orders_202201 VALUES LESS THAN(2),
      PARTITION orders_202202 VALUES LESS THAN(3),
      PARTITION orders_202203 VALUES LESS THAN(4),
      PARTITION orders_202204 VALUES LESS THAN(5),
      PARTITION orders_202205 VALUES LESS THAN(6),
      PARTITION orders_202206 VALUES LESS THAN(7),
      PARTITION orders_202207 VALUES LESS THAN(8),
      PARTITION orders_202208 VALUES LESS THAN(9),
      PARTITION orders_202209 VALUES LESS THAN(10),
      PARTITION orders_202210 VALUES LESS THAN(11),
      PARTITION orders_202211 VALUES LESS THAN(12),
      PARTITION orders_202212 VALUES LESS THAN(13)
    );
  • 在二级分区上创建部分索引。

    创建LIST-RANGE类型的二级分区表tenants,在p0的所有二级分区以及p1p1_1p1_2p1_3分区上创建部分索引ind_id,在p0p0_1p0_2分区以及p1p1_1p1_2分区上创建部分索引ind_date

    CREATE TABLE tenants (
      id INT,
      date DATE,
      count INT,
      KEY ind_id (id)  (
        partition p0, 
        partition p1 (subpartition p1_1, subpartition p1_2, subpartition p1_3)
      ), 
      KEY ind_date (date) (
        partition p0 (subpartition p0_1,  subpartition p0_2),
        partition p1 (subpartition p1_1, subpartition p1_2)
      )
    ) PARTITION BY LIST COLUMNS(id)
      SUBPARTITION BY RANGE (month(date))(
      PARTITION p0 VALUES IN (1, 2, 3, 4, 5) (
        SUBPARTITION p0_1 VALUES LESS THAN(4),
        SUBPARTITION p0_2 VALUES LESS THAN(7),
        SUBPARTITION p0_3 VALUES LESS THAN(10),
        SUBPARTITION p0_4 VALUES LESS THAN(13)
      ),
      PARTITION p1 VALUES IN (11, 12, 13, 14, 15) (
        SUBPARTITION p1_1 VALUES LESS THAN(4),
        SUBPARTITION p1_2 VALUES LESS THAN(7),
        SUBPARTITION p1_3 VALUES LESS THAN(10),
        SUBPARTITION p1_4 VALUES LESS THAN(13)
      )
    );

在已创建好的分区表上创建部分索引

语法

CREATE [UNIQUE] INDEX index_name
    [index_type]
    ON table_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option |partial_partition_option] ...

其中,partial_partition_option为:

([PARTITION partition_name0[(SUBPARTITION subpartition_name0[, ...])]][,...]
  )

语法中的其他参数详情请参见CREATE INDEX

参数说明

参数

说明

index_name

索引名称。

table_name

表名。

partition_name0

一级分区名称。

说明

您可以设置多个一级分区,多个分区名称之间使用英文逗号(,)分隔。

subpartition_name0

二级分区名称。

说明

您可以设置多个二级分区,多个分区名称之间使用英文逗号(,)分隔。

示例

  • 在一级分区上创建部分索引。

    在分区表ordersorders_202201分区上创建部分索引o_part_id

    CREATE INDEX o_part_id ON orders(part_no, order_id) (partition orders_202201);

    您也可以使用ALTER TABLE ADD KEY命令来创建以上示例中的部分索引。

    ALTER TABLE orders ADD KEY o_part_id(part_no, order_id) (partition orders_202201);
  • 在二级分区上创建部分索引。

    在分区表tenantsp0分区的所有二级分区以及p1分区的二级分区p1_1上创建部分索引ind_count

    CREATE INDEX ind_count ON tenants(count) (partition p0, partition p1 (subpartition p1_1));

    您也可以使用ALTER TABLE ADD KEY命令来创建以上示例中的部分索引。

    ALTER TABLE tenants ADD KEY ind_count(count) (partition p0, partition p1 (subpartition p1_1));