使用效果
PolarDB-X透明分布式的單表打散的工作模式就是將一個邏輯庫內的所有表,按照建表時是否顯式使用MySQL分區文法,產生如下的行為(如下圖所示):
若邏輯表沒顯式指定MySQL的分區定義,將作為單表,並被隨機分配到PolarDB-X的不同DN節點,實現負載平衡。
若邏輯表顯式指定MySQL的分區定義,將作為分區表,各個分區均衡分布到不同的DN節點。

適用情境
由於該工作模式會將原有業務的所有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: _defaultsin_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: _defaultsin_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: _defaultsin_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_t1與sin_t3、sin_t2、sin_t4分別落在了不同的DN上,sin_t1與sin_t3落在DN的polardbx-storage-0-master節點上,而sin_t2與sin_t4落在DN的polardbx-storage-1-master節點上。
注意事項
單表打散後,部分表的JOIN執行效能可能會出現變化,這是因為原本同一個DN的多個單表的
JOIN由於落到不同的DN,導致JOIN運算元無法繼續下推至DN執行。若邏輯表沒顯式指定MySQL的分區定義,作為單表被隨機分配到PolarDB-X的不同DN節點時,由於每張表的資料量不同,會導致不同節點空間大小不一樣。