全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
分布式关系型数据库 DRDS

如何高效扫描 DRDS 数据

更新时间:2017-08-14 14:42:15

DRDS 支持高效的数据扫描方式,并支持在全表扫描时使用聚合函数进行统计汇总。

常见的扫描场景如下:

  • 没有分库分表: DRDS 会把原 SQL 传递到后端 MySQL 执行。这种情况下 DRDS 支持任何聚合函数。

  • 非全表扫描:SQL 经过 DRDS 路由后,发送到单个 MySQL 库上执行。比如说拆分键在 WHERE 中是等于关系时,就会出现非全表扫描。此时同样可以支持任何聚合函数。

  • 全表扫描:目前支持的聚合函数有 COUNT、MAX、MIN、SUM。另外在全表扫描时同样支持 LIKE、ORDER BY 、LIMIT 以及 GROUP BY 语法。

  • 并行的全表扫描:如果需要从所有库导出数据,可以通过 SHOW 指令查看表拓扑结构,针对分表并行处理。详见下文。

通过 HINT 来进行表遍历

  1. 执行 SHOW TOPOLOGY FROM TABLE_NAME 指令获取表拓扑结构。

    1. mysql:> SHOW TOPOLOGY FROM DRDS_USERS;
    2. +------+-------------------+--------------+
    3. | ID | GROUP_NAME | TABLE_NAME |
    4. +------+-------------------+--------------+
    5. | 0 | DRDS_00_RDS | drds_users |
    6. | 1 | DRDS_01_RDS | drds_users |
    7. +------+-------------------+--------------+
    8. 2 rows in set (0.06 sec)

    非分库分表的表默认存储在第0个分库。

  2. 针对 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 指令导出数据。但如果想要更快地扫描数据,可以针对每个分表开启多个会话的方式并行加速扫描。

  1. mysql> SHOW TOPOLOGY FROM LJLTEST;
  2. +------+----------------+------------+
  3. | ID | GROUP_NAME | TABLE_NAME |
  4. +------+----------------+------------+
  5. | 0 | TDDL5_00_GROUP | ljltest_00 |
  6. | 1 | TDDL5_00_GROUP | ljltest_01 |
  7. | 2 | TDDL5_00_GROUP | ljltest_02 |
  8. | 3 | TDDL5_01_GROUP | ljltest_03 |
  9. | 4 | TDDL5_01_GROUP | ljltest_04 |
  10. | 5 | TDDL5_01_GROUP | ljltest_05 |
  11. | 6 | TDDL5_02_GROUP | ljltest_06 |
  12. | 7 | TDDL5_02_GROUP | ljltest_07 |
  13. | 8 | TDDL5_02_GROUP | ljltest_08 |
  14. | 9 | TDDL5_03_GROUP | ljltest_09 |
  15. | 10 | TDDL5_03_GROUP | ljltest_10 |
  16. | 11 | TDDL5_03_GROUP | ljltest_11 |
  17. +------+----------------+------------+
  18. 12 rows in set (0.06 sec)

如上所示该表有四个分库,每个分库有三个分表。使用以下的 SQL 对 TDDL5_00_GROUP 库上的分表进行操作:

  1. /!TDDL:node='TDDL5_00_GROUP'*/ select * from ljltest_00;

注意: HINT 中的 TDDL5_00_GROUP 与 SHOW TOPOLOGY 指令结果中的 GROUP_NAME 列相对应。另外 SQL 中的表名为分表名。

此时可开启最多12个会话(分别对应12张分表)并行处理数据。

本文导读目录