开发指南—透明分布式—主键拆分-阿里云开发者社区

开发者社区> -技术小能手-> 正文

开发指南—透明分布式—主键拆分

简介: PolarDB-X新增按主键类型自动拆分表功能,简易地将分布式技术引入到普通DDL语法,您只需要执行简单的修改,系统将根据主键和索引键自动选择拆分键和拆分方式,完成从单机数据库到分布式数据库的切换。
+关注继续查看

前提条件

PolarDB-X内核小版本需为5.4.9或以上。

注意事项

  • 主键拆分表仅支持在建表时指定主键,不支持对已有的表添加或删除主键。
  • 主键拆分表的非LOCAL索引必须指定索引名。
  • 拆分规则变更后,主键拆分表将变成普通表(即不再适用原主键拆分表中的自动拆分规则或索引转换规则)。如何变更拆分规则,请参见变更表类型及拆分规则

语法

在CREATE TABLE语法中新增了PARTITION关键字,同时,在创建索引的子句中新增了LOCALGLOBALCLUSTERED关键字,以适应主键拆分表。


CREATE PARTITION TABLE [IF NOT EXISTS] tbl_name
                (create_definition, ...)
                [table_options]
                [drds_partition_options]
                create_definition:
                col_name column_definition
                | mysql_create_definition
                | [UNIQUE] [LOCAL | GLOBAL | CLUSTERED] INDEX index_name [index_type] (index_col_name,...)
                [global_secondary_index_option]
                [index_option] ...


说明 关于CREATE TABLE的详细语法介绍,请参见CREATE TABLE

如果不想修改DDL,想使用普通单库单表的DDL直接创建主键拆分表,您可以通过在SQL命令行中设置用户变量的方式开启主键拆分,方法如下:

  1. 执行set @auto_partition=1;命令,开启自动主键拆分。
  2. 执行CREATE TABLE语句创建表(无需附加PARTITION关键字),该动作将被视为创建主键拆分表。
  3. 执行set @auto_partition=0;命令,关闭自动主键拆分。

自动拆分规则

  • 如果目标表没有指定主键,PolarDB-X会启用隐式主键并将其作为拆分键,该主键为BIGINT类型的自增主键,且对用户不可见。
  • 如果目标表指定了主键,PolarDB-X会使用该主键作为拆分键。如果为复合主键,则选择复合主键的第一列作为拆分键。
  • 自动拆分仅拆分数据库,不拆分数据表,且拆分算法根据主键类型自动选择:
主键类型拆分算法
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、CHAR、VARCHARHASH
DATE、DATETIME、TIMESTAMPYYYYDD
BIT、FLOAT、DOUBLE、TIME、YEAR、BLOB、ENUM、DECIMAL、BINARY、TEXT、SET、GEOMETRY不支持拆分

索引转换规则

  • 如果指定了LOCAL关键字,即强制指定索引为本地索引。
  • 对主键拆分表执行创建索引操作时,如果未指定LOCAL关键字,该操作将被自动地转变为创建无覆盖列(covering)的全局二级索引,并且按索引列的第一列进行自动拆分。如果需要建立普通的局部索引,您需要指定LOCAL关键字。
  • 创建全局二级索引和聚簇索引时,会创建一个带_local_前缀的本地索引。如果删除全局二级索引,PolarDB-X会自动同步删除对应的本地索引。
  • 主键拆分表可以不指定全局二级索引、聚簇索引的拆分方式,PolarDB-X会根据自动拆分原则对索引键的第一列执行拆分。

下述语句及其注释为您展示了索引的转换规则。


CREATE PARTITION TABLE `t_order` (
  `x` int,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  LOCAL INDEX `l_seller` using btree (`seller_id`), -- 强制指定为本地索引
  UNIQUE LOCAL INDEX `l_order` using btree (`order_id`), -- 强制指定为本地唯一索引
  INDEX `i_seller` using btree (`seller_id`), -- 会被替换为GSI,自动拆分
  UNIQUE INDEX `i_order` using btree (`order_id`), -- 会被替换为UGSI,自动拆分
  GLOBAL INDEX `g_seller` using btree (`seller_id`), -- 自动拆分
  UNIQUE GLOBAL INDEX `g_order` using btree (`order_id`), -- 自动拆分
  CLUSTERED INDEX `c_seller` using btree (`seller_id`), -- 自动拆分聚簇
  UNIQUE CLUSTERED INDEX `c_order` using btree (`order_id`) -- 自动拆分聚簇
);

执行show create table t_order;命令,查看表结构信息。


+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                            |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
  `x` int(11) DEFAULT NULL,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
  UNIQUE LOCAL KEY `_local_i_order` USING BTREE (`order_id`),
  UNIQUE LOCAL KEY `_local_g_order` USING BTREE (`order_id`),
  UNIQUE LOCAL KEY `_local_c_order` USING BTREE (`order_id`),
  LOCAL KEY `l_seller` USING BTREE (`seller_id`),
  LOCAL KEY `_local_i_seller` USING BTREE (`seller_id`),
  LOCAL KEY `_local_g_seller` USING BTREE (`seller_id`),
  LOCAL KEY `_local_c_seller` USING BTREE (`seller_id`),
  UNIQUE CLUSTERED KEY `c_order` USING BTREE (`order_id`) DBPARTITION BY HASH(`order_id`),
  CLUSTERED INDEX `c_seller` USING BTREE(`seller_id`) DBPARTITION BY HASH(`seller_id`),
  UNIQUE GLOBAL KEY `g_order` USING BTREE (`order_id`) DBPARTITION BY HASH(`order_id`),
  GLOBAL INDEX `g_seller` USING BTREE(`seller_id`) DBPARTITION BY HASH(`seller_id`),
  UNIQUE GLOBAL KEY `i_order` USING BTREE (`order_id`) DBPARTITION BY HASH(`order_id`),
  GLOBAL INDEX `i_seller` USING BTREE(`seller_id`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4   |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

主键拆分表的DDL限制

如需对主键拆分表执行下述DDL操作,存在一些限制。


说明 关于下述DDL操作的详细语法介绍,请参见CREATE INDEXALTER TABLE

DDL类别DDL子句说明与限制
CREATE INDEX
  • 如果使用了[UNIQUE] LOCAL INDEX子句,PolarDB-X将创建本地索引,且会自动同步到聚簇索引表中。
  • 如果使用了[UNIQUE] INDEX子句,PolarDB-X将其转换为对应的全局二级索引,同时,自动创建一个带_local_前缀的本地索引并同步到聚簇索引表中。
  • 如果使用了[UNIQUE] GLOBAL | CLUSTERED INDEX子句,PolarDB-X会自动创建一个带_local_前缀的本地索引并同步到聚簇索引表中。
    说明 如果未指定拆分方式则会自动拆分。
ALTER TABLEADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option] ...
ADD [COLUMN] (col_name column_definition,...)
  • PolarDB-X将自动添加对应的列到聚簇全局二级索引(CGSI)和带唯一约束的聚簇全局二级索引(UCGSI)。
  • 支持回滚操作。
DROP [COLUMN] col_name不允许删除主键、主表拆分键、索引表拆分键和复合UNIQUE约束中的列。
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
  • 不允许重命名主键、主表拆分键、索引表拆分键。
  • 不允许重命名复合UNIQUE约束中的列。
    说明 其它列的限制可通过执行Hint:/*+TDDL: cmd_extra(ALLOW_LOOSE_ALTER_COLUMN_WITH_GSI=true)*/命令解除。更多信息,请参见Hint简介
  • 如果仅需修改default信息,推荐使用SET DEFAULT或DROP DEFAULT子句。
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
ALTER TABLE tbl_name ALTER [COLUMN] col_name { SET DEFAULT {literal | (expr)} | DROP DEFAULT }支持回滚操作。

说明 如果列的默认值为current_timestamp,则不支持回滚操作。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot开发案例之分布式集群共享Session
前言 在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。 那么问题来了,如果使用传统管理 Session 的方式,我们会遇到什么样的问题? 案例 这里拿下单举例,用户小明在天猫上相中了一个的娃娃,觉得不错,果断购买,选尺寸,挑身高,然后确认选择,赶紧提交订单,然后就跳转到了登录页面!小明表示很郁闷,大写的问号??? 小明进入娃娃页面,此时请求通过代理服务发送到业务系统一。
998 0
NHibernate 3.2 使用 Conformist 进行 CodeFirst 开发
NHibernate 3.2 GA 正式版于 2011-07-30 发布,这一版本对 CodeFirst 的支持性更好了,因为它提供了 Conformist 取代之前第三方的 ConfOrm。   NHibernate 3.2 下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/   下面将讲一下如何使用这一新成员进行数据库的基本操作。
875 0
从航空母舰上起飞,是怎样一种体验----EDAS带你快速搞定分布式应用
理想是丰满的,现实很骨感,按照很“完美”的模块划分后,在一个大的应用工程下进行开发进行开发,但随着系统功能越来越强大,,软件复杂度急剧增加,开发人员的新旧交替,慢慢的单体应用给开发团队、产品发展等造成的直接弊端,系统维护变得异常艰难。到底该怎么做?
2975 0
17、Python快速开发分布式搜索引擎Scrapy精讲—深度优先与广度优先原理
【http://www.lqkweb.com】 【http://www.swpan.cn】 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认是深度优先的 广度优先 是以层级来执行的,(列队方式实现) 【转载自:http://www.
644 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7751 0
PostgreSQL 11 新特性解读:分区表支持创建主键、外键、索引
PostgreSQL 10 版本虽然支持创建范围分区表和列表分区表,但创建过程依然比较繁琐,需要手工定义子表索引、主键,详见 PostgreSQL10:重量级新特性-支持分区表,PostgreSQL 11 版本得到增强,在父表上创建索引、主键、外键后,子表上将自动创建,本文演示这三种场景。
4607 0
Apache Mina开发手册之三
Apache Mina开发手册之三 2、Mina服务器的架构 Mina服务器的架构图如下所示: 1)IOAcceptor即I/O接收器,负责监听网络连接和发过来的数据包。
762 0
Apache Mina开发手册
Apache Mina开发手册 一、介绍 Apache Mina是一个网络应用框架,简化用户开发高性能、高可扩展性的网络应用程序的难度。Mina提供了一个抽象的事件驱动的异步API,通过Java NIO实现各种传输协议如TCP/IP和UDP/IP。
1005 0
1280
文章
0
问答
来源圈子
更多
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载