PolarDB-X 1.0支持高效的數(shù)據(jù)掃描方式,并支持在全表掃描時使用聚合函數(shù)進行統(tǒng)計匯總。本文介紹如何高效掃描PolarDB-X 1.0數(shù)據(jù)。

常見的掃描場景

  • 沒有分庫分表:PolarDB-X 1.0會把原SQL傳遞到后端MySQL執(zhí)行。這種情況下PolarDB-X 1.0支持任何聚合函數(shù)。
  • 非全表掃描:SQL經(jīng)過PolarDB-X 1.0路由后,發(fā)送到單個MySQL庫上執(zhí)行。比如說拆分鍵在WHERE中是等于關(guān)系時,就會出現(xiàn)非全表掃描。此時同樣可以支持任何聚合函數(shù)。
  • 全表掃描:目前支持的聚合函數(shù)有COUNT、MAX、MIN和SUM。另外在全表掃描時同樣支持LIKE、ORDER BY 、LIMIT以及GROUP BY語法。
  • 并行的全表掃描:如果需要從所有庫導出數(shù)據(jù),可以通過SHOW指令查看表拓撲結(jié)構(gòu),針對分表并行處理。

通過HINT進行表遍歷

  1. 執(zhí)行SHOW TOPOLOGY FROM TABLE_NAME指令獲取表拓撲結(jié)構(gòu)。
    mysql> SHOW TOPOLOGY FROM DRDS_USERS;
    +------+-------------------+--------------+
    | ID   | GROUP_NAME        | TABLE_NAME   |
    +------+-------------------+--------------+
    |    0 | DRDS_00_RDS       | DRDS_USERS   |
    |    1 | DRDS_01_RDS       | DRDS_USERS   |
    +------+-------------------+--------------+
    2 rows in set (0.06 sec)       
    說明
    • 非分庫分表的表默認存儲在第0個分庫。
    • 推薦每次掃描前執(zhí)行SHOW TOPOLOGY FROM TABLE_NAME獲取最新的表拓撲結(jié)構(gòu)。
  2. 針對TOPOLOGY進行單表遍歷。
    • 第0個分庫運行當前SQL。
      /!TDDL:node='DRDS_00_RDS'*/ SELECT * FROM DRDS_USERS;
    • 第1個分庫運行當前SQL。
      /!TDDL:node='DRDS_01_RDS'*/ SELECT * FROM DRDS_USERS;

并行掃描

PolarDB-X 1.0支持mysqldump指令導出數(shù)據(jù)。但如果想要更快地掃描數(shù)據(jù),可以針對每個分表開啟多個會話的方式并行加速掃描。

mysql> SHOW TOPOLOGY FROM LJLTEST;
+------+----------------+------------+
| ID   | GROUP_NAME     | TABLE_NAME |
+------+----------------+------------+
|    0 | TDDL5_00_GROUP | ljltest_00 |
|    1 | TDDL5_00_GROUP | ljltest_01 |
|    2 | TDDL5_00_GROUP | ljltest_02 |
|    3 | TDDL5_01_GROUP | ljltest_03 |
|    4 | TDDL5_01_GROUP | ljltest_04 |
|    5 | TDDL5_01_GROUP | ljltest_05 |
|    6 | TDDL5_02_GROUP | ljltest_06 |
|    7 | TDDL5_02_GROUP | ljltest_07 |
|    8 | TDDL5_02_GROUP | ljltest_08 |
|    9 | TDDL5_03_GROUP | ljltest_09 |
|   10 | TDDL5_03_GROUP | ljltest_10 |
|   11 | TDDL5_03_GROUP | ljltest_11 |
+------+----------------+------------+
12 rows in set (0.06 sec)
如上所示該表有四個分庫,每個分庫有三個分表。使用以下的SQL對TDDL5_00_GROUP庫上的分表進行操作。
/!TDDL:node='TDDL5_00_GROUP'*/ select * from ljltest_00;
說明
  • HINT中的TDDL5_00_GROUP與SHOW TOPOLOGY指令結(jié)果中的GROUP_NAME列相對應(yīng)。
  • SQL中的表名為分表名。
  • 此時可開啟最多12個會話(分別對應(yīng)12張分表)并行處理數(shù)據(jù)。