自动分区

更新时间:2025-03-26 02:35:37

本文为您介绍如何开启自动分区和自动分区的表现形式。

使用效果

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

  • 自动使用表的主键(如无显式指定主键,系统会添加默认主键_drds_implicit_id_)进行水平分区。

  • 表中所有索引都会根据自动分区规则转换为全局索引,并按索引列进行水平分区。

image
说明

系统自动分区后的默认分区数不支持手动修改。

适用场景

自动分区后,普通索引会转为全局索引,这可能会导致表的写入性能下降(写入操作需要通过分布式事务维护全局索引表与主表的一致性),所以自动分区数据库更适合于对性能要求不高的基于MySQL单机数据库开发的应用(比如,一些新开发且需要快速上线的应用)。通常,这类型的业务的库表数目不多,应用的查询场景相对简单(比如按表主键点查)。

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

前提条件

  • 自动分区仅支持AUTO模式数据库,即建库SQL时必须指定MODE='AUTO',示例如下:

    CREATE DATABASE db_name MODE='AUTO';
  • AUTO模式数据库默认是手动分区,需手动设置全局如下参数才能使用自动分区:

    SET GLOBAL AUTO_PARTITION = true;

示例

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

PolarDB-X中,要使用自动分区的建表模式,可以使用以下的建库SQL:

CREATE DATABASE autodb2 MODE='AUTO';

由于目前AUTO库透明分布式的默认的工作模式是手动分区,还需手动执行以下的全局开关方可打开自动分区功能:

SET GLOBAL AUTO_PARTITION=true;

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

执行如下SQL,创建包含主键索引(idx_name)的表:

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

SHOW FULL CREATE TABLE auto_t1;

结果如下:

CREATE PARTITION TABLE `auto_t1` (
	`id` bigint NOT NULL AUTO_INCREMENT,
	`bid` int DEFAULT NULL,
	`name` varchar(30) DEFAULT NULL,
	`birthday` datetime DEFAULT NULL,
	PRIMARY KEY (`id`),
	GLOBAL INDEX /* idx_name_$578c */ `idx_name` (`name`)
		PARTITION BY KEY(`name`,`id`)
		PARTITIONS 16,
	LOCAL KEY `_local_idx_name` (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_0900_ai_ci
PARTITION BY KEY(`id`)
PARTITIONS 16
说明

如上所示,之前的普通索引idx_name被系统按照自动分区规则转换为了全局索引,并且以主键id为分区键进行了分区。

  • 本页导读 (1)
  • 使用效果
  • 适用场景
  • 前提条件
  • 示例
  • 创建使用自动分区的数据库
  • 创建多张MySQL单表并自动分区
  • 查看自动分区表的完整建表SQL