全部產品
Search
文件中心

:單表打散

更新時間:Jan 11, 2025

使用效果

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落在DN的polardbx-storage-0-master節點上,而sin_t2sin_t4落在DN的polardbx-storage-1-master節點上。

注意事項

  • 單表打散後,部分表的JOIN執行效能可能會出現變化,這是因為原本同一個DN的多個單表的JOIN由於落到不同的DN,導致JOIN運算元無法繼續下推至DN執行。

  • 若邏輯表沒顯式指定MySQL的分區定義,作為單表被隨機分配到PolarDB-X的不同DN節點時,由於每張表的資料量不同,會導致不同節點空間大小不一樣。