常见的扫描场景
- 没有分库分表:PolarDB-X会把原SQL传递到后端MySQL执行。这种情况下PolarDB-X支持任何聚合函数。
- 非全表扫描:SQL经过PolarDB-X路由后,发送到单个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;
并行扫描
PolarDB-X支持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张分表)并行处理数据。