单表打散

使用效果

PolarDB-X透明分布式的单表打散的工作模式就是将一个逻辑库内的所有表,按照建表时是否显式使用MySQL分区语法,产生如下的行为(如下图所示):

  • 若逻辑表没显式指定MySQL的分区定义,将作为单表,并被随机分配到PolarDB-X的不同DN节点,实现负载均衡。

  • 若逻辑表显式指定MySQL的分区定义,将作为分区表,各个分区均衡分布到不同的DN节点。

image.png

适用场景

由于该工作模式会将原有业务的所有MySQL单表自动打散各个DN节点,从而突破单机资源瓶颈并实现负载均衡。因此,该模式特别适合于业务应用的库表总体数目众多的场景,而且表间的JOIN关系越少,越适合这个模式。

在实际应用的过程中,关于透明分布式的单表打散工作模式的适用场景,可以参考最佳实践

使用示例

创建使用单表打散的数据库

PolarDB-X中,要使用透明分布式的单表打散工作模式,可以使用以下的建库SQL:

CREATE DATABASE autodb1 MODE='auto' DEFAULT_SINGLE='on';
说明

控制台创建AUTO模式数据库时,系统自动生成的建库SQL中不包含DEFAULT_SINGLE='on'。您需手动执行上述建库SQL。更多信息,请参见CREATE DATABASE。

查看单表打散的完整的建库语句:

mysql> show create database autodb1;
+----------+------------------------------------------------------------------------------------------------------------------+
| DATABASE | CREATE DATABASE                                                                                                  |
+----------+------------------------------------------------------------------------------------------------------------------+
| autodb1  | CREATE DATABASE `autodb1` CHARSET = `utf8mb4` COLLATE = `utf8mb4_general_ci` MODE = 'auto' DEFAULT_SINGLE = 'on' |
+----------+------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

创建多张MySQL单表并自动打散

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

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

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

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

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

查看单表打散后的单表实际拓扑

通过SHOW TOPOLOGY FROM #tableName可以查看各个单表分布的实际位置:

sin_t1:

SHOW TOPOLOGY FROM sin_t1\G
               ID: 0
       GROUP_NAME: AUTODB1_P00000_GROUP
       TABLE_NAME: sin_t1_HnMx
   PARTITION_NAME: p1
SUBPARTITION_NAME: 
      PHY_DB_NAME: autodb1_p00000
            DN_ID: polardbx-storage-0-master
STORAGE_POOL_NAME: _default

sin_t2

SHOW TOPOLOGY FROM sin_t2\G
              ID: 0
       GROUP_NAME: AUTODB1_P00001_GROUP
       TABLE_NAME: sin_t2_IT7l
   PARTITION_NAME: p1
SUBPARTITION_NAME: 
      PHY_DB_NAME: autodb1_p00001
            DN_ID: polardbx-storage-1-master
STORAGE_POOL_NAME: _default

sin_t3

SHOW TOPOLOGY FROM sin_t3\G
               ID: 0
       GROUP_NAME: AUTODB1_P00000_GROUP
       TABLE_NAME: sin_t3_HmtN
   PARTITION_NAME: p1
SUBPARTITION_NAME: 
      PHY_DB_NAME: autodb1_p00000
            DN_ID: polardbx-storage-0-master
STORAGE_POOL_NAME: _default

sin_t4

SHOW TOPOLOGY FROM sin_t4\G
               ID: 0
       GROUP_NAME: AUTODB1_P00001_GROUP
       TABLE_NAME: sin_t4_ab7e
   PARTITION_NAME: p1
SUBPARTITION_NAME: 
      PHY_DB_NAME: autodb1_p00001
            DN_ID: polardbx-storage-1-master
STORAGE_POOL_NAME: _default

从上述各个单表的SHOW TOPOLOGY结果来看,可以发现sin_t1sin_t3sin_t2sin_t4分别落在了不同的DN上,sin_t1sin_t3落在DNpolardbx-storage-0-master节点上,而sin_t2sin_t4落在DNpolardbx-storage-1-master节点上。

注意事项

  • 单表打散后,部分表的JOIN执行性能可能会出现变化,这是因为原本同一个DN的多个单表的JOIN由于落到不同的DN,导致JOIN算子无法继续下推至DN执行。

  • 若逻辑表没显式指定MySQL的分区定义,作为单表被随机分配到PolarDB-X的不同DN节点时,由于每张表的数据量不同,会导致不同节点空间大小不一样。