自动分区

使用效果

PolarDB-X透明分布式的自动分区的工作模式,就是将一个逻辑库内的所有 MySQL单表(没有显式使用MySQL分区语法的表),默认按如下方式决定分区方案(如下图所示):

  • 自动使用表的主键进行水平分区;

  • 表的所有索引自动使用全局索引,并按索引列进行水平分区。

image.png

适用场景

由于该工作模式会对原有业务的所有MySQL单表实施自动分区,所以这种透明分布式的工作模式更适合于对性能要求不高的基于MySQL单机数据库开发的应用(比如,一些新开发的需要快速上线的应用)。通常,这类型而业务的库表数目不多,应用的查询场景相对简单(比如按表主键点查)。

在实际应用的过程中,关于透明分布式的自动分区工作模式的适用场景的细节,可以参考最佳实践

使用示例

创建使用自动分区的数据库

PolarDB-X中,要使用透明分布式的自动分区工作模式,可以使用以下的建库 SQL:

CREATE DATABASE autodb2 MODE='auto' DEFAULT_SINGLE='off';

目前AUTO库透明分布式的默认工作模式是自动分区,所以也可以直接使用以下的建库SQL:

CREATE DATABASE autodb2 MODE='auto';

创建多张MySQL单表并自动分区

可尝试使用以下的建表SQL,在my_autodb内创建多张单表:

CREATE TABLE auto_t1(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime,
 primary key(id),
 index idx_name(name)
);

查看自动分区表的完整建表SQL

mysql> CREATE TABLE auto_t1(
    ->  id bigint not null auto_increment, 
    ->  bid int, 
    ->  name varchar(30),
    ->  birthday datetime,
    ->  primary key(id),
    ->  index idx_name(name)
    -> );

Query OK, 0 rows affected (2.44 sec)

mysql> 
mysql> show full create table auto_t1\G
*************************** 1. row ***************************
       Table: auto_t1
Create Table: CREATE PARTITION TABLE `auto_t1` (
	`id` bigint(20) NOT NULL AUTO_INCREMENT,
	`bid` int(11) DEFAULT NULL,
	`name` varchar(30) DEFAULT NULL,
	`birthday` datetime DEFAULT NULL,
	PRIMARY KEY (`id`),
	GLOBAL INDEX /* idx_name_$6425 */ `idx_name` (`name`) 
		PARTITION BY KEY(`name`,`id`)
		PARTITIONS 3,
	LOCAL KEY `_local_idx_name` (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`id`)
PARTITIONS 3
/* tablegroup = `tg3741` */
1 row in set (0.03 sec)

可见,原MySQL单表在PolarDB-X下自动分区,索引自动变成全局索引。

注意事项

  • 必须是AUTO库才支持透明分布式自动分区模式(DRDS 库不支持),即建库 SQL 时必须指定 MODE='AUTO' ;

  • 自动分区后,部分表的写入性能可能变会大,这是部分表原来的索引变成全局索引表,导致写入操作需要通过分布式事务维护全局索引表与主表的一致性。