DRDS 支持高效的數據掃描方式,並支持在全表掃描時使用聚合函數進行統計彙總。
常見的掃描場景如下:
沒有分庫分表: DRDS 會把原 SQL 傳遞到後端 MySQL 執行。這種情況下 DRDS 支持任何聚合函數。
非全表掃描:SQL 經過 DRDS 路由後,發送到單個 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個分庫。
針對 TOPOLOGY 進行單表遍歷。
第0個分庫運行當前 SQL
/!TDDL:node='DRDS_00_RDS'*/ SELECT * FROM DRDS_USERS;
第1個分庫運行當前 SQL
/!TDDL:node='DRDS_01_RDS'*/ SELECT * FROM DRDS_USERS;
注意:推薦每次掃描前執行 SHOW TOPOLOGY FROM TABLE_NAME 獲取最新的表拓撲結構。
並行掃描
DRDS 支持 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張分表)並行處理數據。
參考 : https://developer.aliyun.com/ask/202509?spm=a2c6h.13524658