PolarDB-X 1.0支援高效的資料掃描方式,並支援在全表掃描時使用彙總函式進行統計匯總。本文介紹如何高效掃描PolarDB-X 1.0資料。
常見的掃描情境
- 沒有分庫分表:PolarDB-X 1.0會把原SQL傳遞到後端MySQL執行。這種情況下PolarDB-X 1.0支援任何彙總函式。
- 非全表掃描:SQL經過PolarDB-X 1.0路由後,發送到單個MySQL庫上執行。比如說拆分鍵在WHERE中是等於關係時,就會出現非全表掃描。此時同樣可以支援任何彙總函式。
- 全表掃描:目前支援的彙總函式有COUNT、MAX、MIN和SUM。另外在全表掃描時同樣支援LIKE、ORDER BY 、LIMIT以及GROUP BY文法。
- 並行的全表掃描:如果需要從所有庫匯出資料,可以通過SHOW指令查看錶拓撲結構,針對分表平行處理。
通過HINT進行表遍曆
- 執行
SHOW TOPOLOGY FROM TABLE_NAME指令擷取表拓撲結構。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個分庫。
- 推薦每次掃描前執行SHOW TOPOLOGY FROM TABLE_NAME擷取最新的表拓撲結構。
- 針對TOPOLOGY進行單表遍曆。
- 第0個分庫運行當前SQL。
/!TDDL:node='DRDS_00_RDS'*/ SELECT * FROM DRDS_USERS; - 第1個分庫運行當前SQL。
/!TDDL:node='DRDS_01_RDS'*/ SELECT * FROM DRDS_USERS;
- 第0個分庫運行當前SQL。
並行掃描
PolarDB-X 1.0支援mysqldump指令匯出資料。但如果想要更快地掃描資料,可以針對每個分表開啟多個會話的方式並行加速掃描。
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指令結果中的GROUP_NAME列相對應。
- SQL中的表名為分表名。
- 此時可開啟最多12個會話(分別對應12張分表)平行處理資料。