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

分区表使用建议

SQL新手 2022-12-08
214

本文介绍OceanBase数据库 中的 MySQL 模式下分区表的使用建议。

背景信息

通常当表的数据量非常大,以致于可能使数据库空间紧张,或者由于表非常大导致相关 SQL 查询性能变慢时,可以考虑使用分区表。

使用分区表时要选择合适的拆分键以及拆分策略。如果是日志类型的大表,根据时间类型的列做 RANGE 分区是最合适的。如果是并发访问非常高的表,结合业务特点选择能满足绝大部分核心业务查询的列作为拆分键是最合适的。无论选哪个列作为分区键,都不大可能满足所有的查询性能。

分区表中的全局唯一性需求可以通过主键约束和唯一约束实现。OceanBase 数据库的分区表的主键约束和局部唯一索引必须包含拆分键。唯一约束也是一个全局索引。全局唯一的需求也可以通过本地唯一索引实现,只需要在唯一索引里包含拆分键。

示例

创建有唯一性约束的分区表

  1. 创建 account 表。

    CREATE TABLE account(
             id bigint NOT NULL PRIMARY KEY
             , name varchar(50) NOT NULL
             , value number NOT NULL
             , gmt_create timestamp DEFAULT current_timestamp NOT NULL
             , gmt_modified timestamp DEFAULT current_timestamp NOT NULL
         ) PARTITION BY HASH(id) PARTITIONS 16;
    
  2. 创建索引 account_uk

     CREATE UNIQUE INDEX account_uk ON account(name, id) LOCAL ;
    
  3. 查看 account 表索引。

    obclient> SHOW INDEXES FROM account;
    +---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
    | Table   | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment   | Index_comment | Visible |
    +---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
    | account |          0 | PRIMARY    |            1 | id          | A         |        NULL | NULL     | NULL   |      | BTREE      | available |               | YES     |
    | account |          0 | account_uk |            1 | name        | A         |        NULL | NULL     | NULL   |      | BTREE      | available |               | YES     |
    | account |          0 | account_uk |            2 | id          | A         |        NULL | NULL     | NULL   |      | BTREE      | available |               | YES     |
    +---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
    3 rows in set
    
  4. 查看分区表中的约束与索引信息。

    obclient>  SELECT * FROM information_schema.`TABLE_CONSTRAINTS` WHERE table_schema='data_ny' AND table_name='ACCOUNT';
    +--------------------+-------------------+-----------------+--------------+------------+-----------------+
    | CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE |
    +--------------------+-------------------+-----------------+--------------+------------+-----------------+
    | def                | data_ny           | PRIMARY         | data_ny      | account    | PRIMARY KEY     |
    | def                | data_ny           | account_uk      | data_ny      | account    | UNIQUE          |
    +--------------------+-------------------+-----------------+--------------+------------+-----------------+
    2 rows in set
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论