DRDS 支持高效的數據掃描方式,並支持在全表掃描時使用聚合函數進行統計匯總。
常見的掃描場景如下:
-
沒有分庫分表: DRDS 會把原 SQL 傳遞到后端 MySQL 執行。這種情況下 DRDS 支持任何聚合函數。
-
非全表掃描:SQL 經過 DRDS 路由后,發送到單個 MySQL 庫上執行。比如說拆分鍵在 WHERE 中是等於關系時,就會出現非全表掃描。此時同樣可以支持任何聚合函數。
-
全表掃描:目前支持的聚合函數有 COUNT、MAX、MIN、SUM。另外在全表掃描時同樣支持 LIKE、ORDER BY 、LIMIT 以及 GROUP BY 語法。
-
並行的全表掃描:如果需要從所有庫導出數據,可以通過 SHOW 指令查看表拓撲結構,針對分表並行處理。詳見下文。
執行 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 獲取最新的表拓撲結構。
若為分表,則 SQL 中的表名為分表名。
比如:
DRDS>SHOW TOPOLOGY FROM c_schedule +--------------+-----------------------------------------------+----------------------+ | ID | GROUP_NAME | TABLE_NAME | +--------------+-----------------------------------------------+----------------------+ | 0 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0000 | c_schedule | +--------------+-----------------------------------------------+----------------------+ 返回行數: 1 耗時: 6.00 ms. DRDS>SHOW TOPOLOGY FROM cs_fb +--------------+-----------------------------------------------+----------------------+ | ID | GROUP_NAME | TABLE_NAME | +--------------+-----------------------------------------------+----------------------+ | 0 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0000 | cs_fb_ojR3_00 | | 1 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0000 | cs_fb_ojR3_01 | | 2 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0000 | cs_fb_ojR3_02 | | 3 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0001 | cs_fb_ojR3_03 | | 4 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0001 | cs_fb_ojR3_04 | | 5 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0001 | cs_fb_ojR3_05 | | 6 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0002 | cs_fb_ojR3_06 | | 7 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0002 | cs_fb_ojR3_07 | | 8 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0002 | cs_fb_ojR3_08 | | 9 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0003 | cs_fb_ojR3_09 | | 10 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0003 | cs_fb_ojR3_10 | | 11 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0003 | cs_fb_ojR3_11 | | 12 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0004 | cs_fb_ojR3_12 | | 13 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0004 | cs_fb_ojR3_13 | | 14 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0004 | cs_fb_ojR3_14 | | 15 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0005 | cs_fb_ojR3_15 | | 16 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0005 | cs_fb_ojR3_16 | | 17 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0005 | cs_fb_ojR3_17 | | 18 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0006 | cs_fb_ojR3_18 | | 19 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0006 | cs_fb_ojR3_19 | | 20 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0006 | cs_fb_ojR3_20 | | 21 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0007 | cs_fb_ojR3_21 | | 22 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0007 | cs_fb_ojR3_22 | | 23 | ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0007 | cs_fb_ojR3_23 | +--------------+-----------------------------------------------+----------------------+ 返回行數: 24 耗時: 18.00 ms.
查詢:
/!TDDL:node='ONE_www_ZyiZ_1586333425057BUHJ_VA8S_0006'*/ SELECT * FROM cs_fb_ojR3_19 ;
計算表的方法:比如:
select (2020*12+3)%8
2020為年,年*12,加上月份3,再除以物理庫8個。