专栏名称: 阿里开发者
阿里巴巴官方技术号,关于阿里的技术创新均将呈现于此
目录
相关文章推荐
阿里开发者  ·  OpenAI故障复盘|如何保障大规模K8s集 ... ·  昨天  
白鲸出海  ·  中国互联网出海一周头条 ... ·  3 天前  
51好读  ›  专栏  ›  阿里开发者

无缝集成 MySQL,解锁秒级数据分析性能极限

阿里开发者  · 公众号  · 科技公司  · 2025-01-08 18:00

主要观点总结

本文介绍了通过结合AnalyticDB MySQL和DTS解决MySQL数据分析性能问题的方法。文章详细描述了如何构建企业级数据分析平台,利用云原生数据仓库AnalyticDB MySQL版的高性能分析能力,满足金融、零售、制造业等领域的快速报表查询需求。通过DTS实现数据实时同步,确保数据一致性。方案包括创建资源组、执行复杂逻辑验证、使用窗口函数进行数据分析等步骤。最后,文章强调了查看SQL查询根据绑定关系路由到相应资源组的执行情况的重要性。

关键观点总结

关键观点1: 文章介绍了通过AnalyticDB MySQL和DTS解决MySQL数据分析性能问题的方法。

提升数据处理和查询效率,满足企业在线统计分析需求。

关键观点2: 文章详细描述了构建企业级数据分析平台的过程。

利用云原生数据仓库AnalyticDB MySQL版的高性能分析能力,支持复杂SQL查询的快速执行。

关键观点3: 通过DTS实现数据实时同步。

确保业务数据在多个系统间的实时性和一致性。

关键观点4: 文章介绍了创建资源组的过程和执行复杂逻辑验证的步骤。

包括创建云原生数据仓库AnalyticDB MySQL版的高权限账号和资源组,以及验证其高性能查询能力。

关键观点5: 文章强调了使用云原生数仓AnalyticDB MySQL的窗口函数进行数据分析的优势。

提供了丰富的窗口函数,支持各种数据分析场景。

关键观点6: 文章介绍了如何查看SQL查询根据绑定关系路由到相应资源组的执行情况。

强调监控和分析查询执行过程的重要性,以优化数据分析和处理流程。


正文

阿里妹导读


在数据驱动决策的时代,一款性能卓越的数据分析引擎不仅能提供高效的数据支撑,同时也解决了传统 OLTP 在数据分析时面临的查询性能瓶颈、数据不一致等挑战。本文将介绍通过 AnalyticDB MySQL + DTS 来解决 MySQL 的数据分析性能问题。

引言

在应对大规模业务数据的在线统计分析需求时,传统数据库常常难以满足高性能和实时分析的要求。随着业务数据的不断累积,数据量迅速膨胀,虽然可以通过扩展数据库配置来暂时提升查询性能,但扩容过程中会影响用户体验和业务连续性。如何快速灵活地将复杂查询操作与日常业务事务处理分开,通常需要大量开发工作来实现 OLTP 数据库与 OLAP 数据库之间的数据同步,并确保数据的一致性。

本文将介绍结合 AnalyticDB MySQL + DTS 来解决 MySQL 的数据分析性能问题。通过 DTS(数据传输服务),实现 MySQL 到云原生数据仓库 AnalyticDB MySQL 版的实时数据同步。DTS 提供全量校验和增量校验功能,确保两者之间的数据一致性。在云原生数据仓库 AnalyticDB MySQL 版中创建交互式资源组,并通过数据库账号将其绑定至资源组,SQL 查询根据绑定关系路由到相应的资源组进行执行,最终由云原生数据仓库 AnalyticDB MySQL 版对外提供应用查询服务。其优势在于:

1.简单易用

AnalyticDB MySQL 高度兼容 MySQL 协议和多种 SQL 标准,且提供了窗口函数、圈人函数、漏斗留存函数、路径分析函数等多种函数,满足多种数据分析场景。

2.高性能

超大规模数据写入实时可见,确保数据的强一致性。支持秒级甚至毫秒级对海量数据进行查询和计算,复杂 SQL 查询速度相比传统的关系型数据库快多倍。

3.低成本

存储计算分离,支持计算资源按需在线扩缩容、分时弹性和按需弹性等功能。同时支持冷热数据分层存储,按实际使用的存储空间计费,降低了计算和存储的成本。

4.应用场景广泛

  • 业务报表统计:利用 AnalyticDB MySQL 的高性能分析能力,在金融、零售、制造业等领域提供快速的报表查询引擎。

  • 交互式运营分析:利用 AnalyticDB MySQL 的实时交互式查询分析能力,帮助用户在多维数据集中更全面的分析和决策。

  • 实时数仓:利用 DTS 和 AnalyticDB MySQL 实现数据实时同步,通过实时数据的快速分析和洞察,为业务决策提供了有力支持。

方案概览


一键加速, AnalyticDB MySQL 版构建企业级数据分析平台

使用 DMS 的测试数据构建模拟生成生产数据到云数据库 RDS MySQL 版实例,利用 DTS 实现用户可视化操作,通过一键数据同步,灵活配置云数据库 RDS MySQL版实例与云原生数据仓库 AnalyticDB MySQL 版集群之间的数据表实时同步。DTS 提供全量校验和增量校验功能,确保云数据库 RDS MySQL 版实例与云原生数据仓库 AnalyticDB MySQL 版集群的数据一致性。借助云原生数据仓库 AnalyticDB MySQL 版集群的在线实时分析能力,解决大规模业务数据的在线统计分析需求。

方案架构

1.本方案的技术架构包括以下基础设施和云服务:
  • 1个专有网络 VPC:为云数据库 RDS MySQL 版实例和云原生数据仓库 AnalyticDB MySQL 版集群等云资源构建云上私有网络。

  • 1个云数据库 RDS MySQL 版实例:用于在线事务处理(OLTP)系统的数据库,存储业务系统数据。

  • 1个 DTS(数据传输服务)实例 : 用于实现云数据库 RDS MySQL 版实例与云原生数据仓库AnalyticDB MySQL 版集群之间的数据实时同步。

  • 1个云原生数据仓库 AnalyticDB MySQL 版集群:作为 DTS 数据同步的目标端,同时优化数据查询性能,为实时报表生成和交互式运营分析等 OLAP 业务提供快速响应支持。

  • 数据管理 DMS:用于数据库实例管理,用来连接云原生数据仓库 AnalyticDB MySQL 版集群和云数据库 RDS MySQL 版实例。

2.技术架构图如下:

操作流程

部署资源

规划好资源后,按照以下步骤部署方案中的所有资源。

一、创建专有网络 VPC 和交换机

二、创建云数据库 RDS MySQL 版实例

三、创建云原生数据仓库 AnalyticDB MySQL 版集群

创建数据同步账号

在资源部署的阶段,已经创建了云数据库 RDS MySQL 版实例、云原生数据仓库 AnalyticDB MySQL 版集群。接下来,需要对云数据库 RDS MySQL 版实例创建高权限账号用于后续的数据同步,对云原生数据仓库 AnalyticDB MySQL 版集群创建一个高权限账号和资源组,以执行数据分析的操作。

一、创建云原生数据仓库 AnalyticDB MySQL 版集群高权限账号与资源组

1、创建高权限账号

登录云原生数据仓库 AnalyticDB MySQL 控制台:

https://ads.console.aliyun.com/ , 根据控制台提示,设置账号名称(本方案示例为 adb_admin)和密码。账号类型选择高权限账号,单击确定。

2、创建Interactive型资源组

登录云原生数据仓库 AnalyticDB MySQL 控制台:

https://ads.console.aliyun.com/ ,在资源组管理页面,单击资源组列表右上角的新增资源组。设置资源组名称(本方案示例为 xihe_mpp),任务类型为 Interactive,Cluster 大小(本方案示例为16ACU),最小Cluster个数(本方案示例为 1),最大Cluster个数 (本方案示例为 2)。选择完成后,单击确定。

单击绑定用户。在弹出的绑定用户对话框,在用户名下拉框选择用户(本方案示例为adb_admin),然后单击绑定用户,最后单击右上角关闭图标。

二、创建云数据库 RDS MySQL 版实例高权限账号

登录云数据库 RDS 控制台 :

https://rdsnext.console.aliyun.com/rdsList/cn-shanghai/basic,在用户账号页签中,单击创建账号按钮, 设置数据库账号(本方案示例为 db_user)、账号类型(本方案示例为高权限账号)、密码信息(用户自定义),填写完成后单击确定。

构建测试数据

本阶段构建用于测试的业务系统表数据,为后续数据同步、数据分析做准备。

在云数据库 RDS 控制台实例列表页,基本信息页面的右上角,单击登录数据库。

https://rdsnext.console.aliyun.com/rdsList/cn-shanghai/basic

输入云数据库 RDS MySQL 创建的数据库账号和密码,点击测试连接,连接通过,单击登录。

登录完成以后,默认数据库为 information_schema ,同时生成一个新的SQLConsole ,在 SQLConsole 中输入下面代码块中的 SQL 语句,然后单击,完成数据库和数据表的创建。

-- 创建数据库CREATE DATABASE IF NOT EXISTS workshop;
-- 用户信息表CREATE TABLE IF NOT EXISTS workshop.user_info (    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',    user_name VARCHAR(255) NOT NULL COMMENT '用户名',    gender ENUM('M', 'F') COMMENT '性别,M为男性,F为女性',    city_id INT COMMENT '城市ID',    create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',    update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间') COMMENT='用户信息表';
-- 城市信息表CREATE TABLE IF NOT EXISTS workshop.city_info (    city_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '城市ID',    city_name VARCHAR(255) NOT NULL UNIQUE COMMENT '城市名称',    create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',    update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间') COMMENT='城市信息表';
-- 产品信息表CREATE TABLE IF NOT EXISTS workshop.product_info (    product_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',    product_name VARCHAR(255) NOT NULL UNIQUE COMMENT '产品名称',    product_price DECIMAL(10, 2) NOT NULL COMMENT '产品价格',    create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',    update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间') COMMENT='产品信息表';
-- 订单信息表CREATE TABLE IF NOT EXISTS workshop.order_info (    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',    user_id INT NOT NULL COMMENT '用户ID',    product_id INT NOT NULL COMMENT '产品ID',  quantity INT NOT NULL COMMENT '数量',    order_status ENUM(        'PENDING',     -- 待处理        'PAID',        -- 已支付        'SHIPPED',     -- 已发货        'DELIVERED',   -- 已送达        'CANCELLED',   -- 已取消        'RETURNED'     -- 已退货    ) NOT NULL DEFAULT 'PENDING' COMMENT '订单状态',  order_date DATETIME NOT NULL  COMMENT '订单时间',  is_delete TINYINT DEFAULT 0 comment '0 表示未删除,1 表示已删除',    create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',    update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间') COMMENT='订单信息表';
执行成功后在已登录实例中,刷新实例右侧,然后点开实例,双击 workshop(本案例数据库名称)。然后单击右侧刷新按钮,检查创建成功的表。

单击页面左上角快捷菜单,单击全部功能,然后在筛选框中输入“测试数据构建”,单击测试数据构建。

进入测试数据构建工单列表页签,单击右侧测试数据构建。

测试数据构建,依次对city_infouser_infoproduct_infoorder_info 进行测试数据构建。

单击 ,显示状态为任务执行完成,测试数据构建完成。

配置数据同步

到目前为止,我们通过测试数据构建模拟生成业务系统数据,接下来我们需要将云数据库 RDS MySQL 版实例中业务系统数据同步到云原生数据仓库 AnalyticDB MySQL 版集群中。

登录 数据传输服务 DTS 控制台 :

https://dtsnew.console.aliyun.com/sync/cn-shanghai

在左侧导航栏,单击数据同步。在数据同步页面中,单击创建任务按钮,按照如下规划配置 DTS 的相关配置项。

高级配置:

数据校验:

库表列配置,选择定义状态列为全部 ,类型列根据下图所示进行选择。

返回任务列表,等待任务启动,启动时间需要大概2分钟。可以单击实例 id (本方案示例:RDS2ADB),查看实例进展。当看到如下界面,表示存量数据已迁移完成,增量数据会实时同步。此时就可以进入下一步方案验证。

方案验证

数据已经同步到云原生数仓 AnalyticDB MySQL 版集群中,接下来通过执行复杂逻辑和使用窗口函数验证云原生数仓 AnalyticDB MySQL 版的高性能查询,并查看 SQL 查询绑定关系的资源组执行情况。

一、执行复杂逻辑,验证云原生数仓 AnalyticDB MySQL 高性能查询。

登录云原生数据仓库AnalyticDB MySQL控制台:

https://ads.console.aliyun.com/ 填写登录信息。

在 DMS 的 数据库实例 > 已登录实例中,找到上述创建的云数据库 AnalyticDB MySQL 实例,点开左侧 按钮,找到并双击目标数据库 workshop(本方案示例值),即可切换到新建 SQLConsole 中 。在新建的 SQLConsole 中执行下面文本框的复杂逻辑,验证 AnalyticDB MySQL 查询性能。

-- 查询每个城市的订单总数、总金额、平均订单金额,并且包括每个用户的订单统计信息WITH user_order_stats AS (    SELECT         u.user_id,        u.user_name,        u.city_id,        COUNT(o.order_id) AS user_total_orders,        SUM(o.quantity * p.product_price) AS user_total_amount,        AVG(o.quantity * p.product_price) AS user_average_amount    FROM         workshop.order_info o    JOIN         workshop.user_info u ON o.user_id = u.user_id    JOIN         workshop.product_info p ON o.product_id = p.product_id    WHERE         o.is_delete = 0    GROUP BY         u.user_id, u.user_name, u.city_id),city_order_stats AS (    SELECT         c.city_id,        c.city_name,        COUNT(o.order_id) AS total_orders,        SUM(o.quantity * p.product_price) AS total_amount,        AVG(o.quantity * p.product_price) AS average_amount    FROM         workshop.order_info o    JOIN         workshop.user_info u ON o.user_id = u.user_id    JOIN         workshop.city_info c ON u.city_id = c.city_id    JOIN         workshop.product_info p ON o.product_id = p.product_id    WHERE         o.is_delete = 0    GROUP BY         c.city_id, c.city_name)SELECT     cos.city_id,    cos.city_name,    cos.total_orders,    cos.total_amount,    cos.average_amount,    uos.user_id,    uos.user_name,    uos.user_total_orders,    uos.user_total_amount,    uos.user_average_amountFROM     city_order_stats cosJOIN     user_order_stats uos ON cos.city_id = uos.city_idORDER BY     cos.total_orders DESC, uos.user_total_orders DESClimit 100 ;
再从DMS  数据库实例 > 已登录实例中,找到上述创建的云数据库 RDS MySQL实例,点开左侧 按钮,找到 workshop(本方案示例值) ,双击鼠标左键新建一个 SQLConsole 。把上述 SQL 在云数据库 RDS MySQL 中进行验证,可以看到 SQL Console 下侧执行结果页面的下方的总耗时,在云数据库 RDS MySQL 中执行的总耗时明显比 AnalyticDB MySQL 总耗时要长,当数据表的数据量越大,AnalyticDB MySQL 凸显的性能优势越明显。

二、使用云原生数仓 AnalyticDB MySQL 窗口函数,进行数据分析。

1、使用排序窗口函数 ROW_NUMBER

-- 假设我们要计算user_id是1的用户,订单按购买金额倒序排序SELECT     u.user_id,    u.user_name,    o.order_id,    o.quantity,    p.product_price,    o.quantity * p.product_price AS order_amount,    o.order_date,    ROW_NUMBER() OVER (PARTITION BY u.user_id ORDER BY o.quantity * p.product_price DESC) AS rank_by_amountFROM     workshop.order_info oJOIN     workshop.user_info u ON o.user_id = u.user_idJOIN     workshop.product_info p ON o.product_id = p.product_idWHERE  u.user_id=1 and o.is_delete = 0ORDER BY     u.user_id, o.quantity * p.product_price DESC;
2、使用聚合窗口函数 SUM
-- 假设我们要计算user_id是1的用户,按照下单时间正序排序,查看截止到每一笔累计订单金额明细。SELECT     u.user_id,    u.user_name,    o.order_date,    o.order_id,    o.quantity,    p.product_price,    o.quantity * p.product_price AS order_amount,    SUM(o.quantity * p.product_price) OVER (PARTITION BY u.user_id ORDER BY o.order_date ASC) AS cumulative_amountFROM     workshop.order_info oJOIN     workshop.user_info u ON o.user_id = u.user_idJOIN     workshop.product_info p ON o.product_id = p.product_idWHERE u.user_id=1 AND o.is_delete = 0ORDER BY     u.user_id, o.order_date ASC;
3、使用值窗口函数 LAG
-- 假设我们要计算user_id是1的用户,按照下单时间正序排序,查看每个订单与其前一个订单的金额差异。SELECT     o.order_id,    u.user_name,    o.order_date,    o.quantity,    p.product_price,    o.quantity * p.product_price AS order_amount,    LAG(o.quantity * p.product_price) OVER (PARTITION BY u.user_id ORDER BY o.order_date ASC) AS previous_order_amount,    (o.quantity * p.product_price) - LAG(o.quantity * p.product_price) OVER (PARTITION BY u.user_id ORDER BY o.order_date ASC) AS amount_differenceFROM     workshop.order_info oJOIN     workshop.user_info u ON o.user_id = u.user_idJOIN     workshop.product_info p ON o.product_id = p.product_idWHERE     o.is_delete = 0 AND u.user_id=1ORDER BY  o.order_date ASC;
云原生数仓 AnalyticDB MySQL 提供了丰富的窗口函数,具体可以点击阅读原文查看方案详详情。

三、查看 SQL 查询,根据绑定关系路由到相应资源组的执行情况。

登录云原生数据仓库AnalyticDB MySQL 版控制台:

https://ads.console.aliyun.com/在右上角功能说明中,选择“已完成的查询”和“最近24小时”。然后单击右下角的显示高级搜索,分别填写资源组(本方案示例:xihe_mpp)、用户名(本方案示例:adb_admin)、数据库(本方案示例:workshop)对应的参数值。单击右侧搜索,查询到的 SQL 列表就是使用高权限账号绑定 Interactive 类型资源组执行的查询记录。


点击阅读全文,查看本方案完整详情,解锁秒级 OLAP 分析性能极限。