实验报告: PolarDB MySQL HTAP:实时数据分析加速

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 实验过程中忽略了在PolarDB mysql集群设置时开启行存/列存自动引流功能,发现开启这个功能后,如果会话use_imci_engine变量设置为off,单表分析的查询要慢不少。

1 设置PolarDB MySQL集群白名单,创建数据库及账号

打开PolarDB MySQL控制台,找到创建的集群

屏幕截图(1160).png

设置白名单,白名单内加入实验创建的ECS资源的公网ip

屏幕截图(1162).png

创建普通账号

屏幕截图(1163).png

创建数据库,绑定到刚才创建的账号

屏幕截图(1165).png

2申请集群公网地址,开启行存/列存自动引流功能

这个设置是RDS没有的,需要点击左侧的基本信息

屏幕截图(1166).png

屏幕截图(1166).png

找到数据库代理企业通讯版,点击公网右侧的申请,申请一个公网地址。公网地址申请完后,点击编辑配置,配置行列存自动引流。

屏幕截图(1171).png


这里的行存/列存自动引流需要开启,默认是关闭的。可以看到系统已经自动选择了主节点、只读节点和只读列存节点。我在做这个实验时,忽略了打开这个自动引流功能,发现前两个sql运行时只需要2秒左右,而在这里打开这个功能后,如果use_imci_engine变量值为off,运行的时间就在10秒以上,甚至接近20秒了。

3 创建测试表,导入数据

在DMS中创建测试表,登录DMS,复制表创建sql脚本,粘贴运行。

屏幕截图(1170).png

运行之后,在表一栏中点击刷新图标即可看到新建的表。

数据导入在ECS中进行,打开web终端,复制数据导入脚本,更改脚本中的xxxx为申请的集群公网地址,粘贴到终端内运行即可。

4

bash /root/benchtpch/tpch/data_kit.sh --parallel2--base /usr  -s1-c64--data /root/benchtpch/tpchdata1g --database tpch1g --ddl /root/benchtpch/tpch/columnar.ddl --host mypolar.rwlb.rds.aliyuncs.com --port3306-u test_user -p Password123 load

数据装载大概需要十分钟左右,看到下面的输出,就知道数据装载成功了。

mysql: [Warning] Using a password on the command line interface can be insecure.
    Fri Aug 2603:56:47 PM CST 2022 [INFO] Loaded data part 63for tpch1g.lineitem from /root/benchtpch/tpchdata1g/lineitem.tbl.63 ...
    Fri Aug 2603:56:48 PM CST 2022 [INFO] All 2 threads for tpch1g.lineitem finish
    Fri Aug 2603:56:48 PM CST 2022 [INFO] Finish loading data for database tpch1g with 64 chunks in2 threads

4 测试行列存自动引流的效果

测试之前需要登录数据库

[root@iZuf6c5z7jjuumae5hhkr7Z ~]# /usr/bin/mysql --host mypolar.rwlb.rds.aliyuncs.com --port 3306 -utest_user -pPassword123    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 536874751    Server version: 8.0.13 Source distribution
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.

可以看到数据库的版本为8.0.13

4.1 单表分析查询

自动引流默认是打开的

mysql> show variables like'use_imci%';+-----------------+-------+| Variable_name   | Value |+-----------------+-------+| use_imci_engine |ON|+-----------------+-------+1 row inset(0.01 sec)

执行单表查询的sql语句

mysql>select       sum(l_extendedprice * l_discount)as revenue from       lineitem where       l_shipdate >=date '1994-01-01'and l_shipdate <date '1994-01-01'+ interval '1'yearand l_discount between.06-0.01and.06+0.01and l_quantity <24;+----------------+| revenue        |+----------------+|123141078.2283|+----------------+1 row inset(0.47 sec)

执行用时0.47秒,看一下执行计划

mysql> explain select sum(l_extendedprice * l_discount)as revenue from lineitem where l_shipdate >=date '1994-01-01'and l_shipdate <date '1994-01-01'+ interval '1'yearand l_discount between.06-0.01and.06+0.01and l_quantity <24;+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| IMCI Execution Plan (max_dop =2, max_query_mem =428867584)|+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+|Project | Exprs: temp_table1.SUM(lineitem.l_extendedprice* lineitem.l_discount)  HashGroupby | OutputTable(1): temp_table1 | Grouping: None | Output Grouping: None  | Aggrs: SUM(lineitem.l_extendedprice* lineitem.l_discount)    CTableScan | InputTable(0): lineitem | Pred:((lineitem.l_shipdate>=01/01/199400:00:00.000000)AND(lineitem.l_shipdate<01/01/199500:00:00.000000)AND(lineitem.l_quantity<24.00)AND( lineitem.l_discount BTW 0.05AND0.07))|+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row inset(0.01 sec)

使用了IMCI Execution Plan,先扫描后进行了HashGroupby。设置use_imci_engine为off后再看。

mysql>set use_imci_engine = off;Query OK,0 rows affected (0.00 sec)mysql>select->       sum(l_extendedprice * l_discount)as revenue
->from->       lineitem
->where->       l_shipdate >=date '1994-01-01'->and l_shipdate <date '1994-01-01'+ interval '1'year->and l_discount between.06-0.01and.06+0.01->and l_quantity <24;+----------------+| revenue        |+----------------+|123141078.2283|+----------------+1 row inset(19.61 sec)

  执行用时为19.61秒,慢的不是一点半点。看一下执行计划

mysql> explain select sum(l_extendedprice * l_discount)as revenue from lineitem where l_shipdate >=date '1994-01-01'and l_shipdate <date '1994-01-01'+ interval '1'yearand l_discount between.06-0.01and.06+0.01and l_quantity <24;+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+| id | select_type |table| partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+|1| SIMPLE      | lineitem |NULL| ALL  |NULL|NULL|NULL|NULL|5970318|0.41| Using where|+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+1 row inset,1 warning (0.00 sec)

做这个测试的时候遇到了以下小插曲,再设置行列存自动引流功能时,忽略了在集群设置时打开这个功能。在做这个测试时,第一次运行 时间为20秒左右,在第二次运行时执行用时就是2秒左右了。猜测是第二次运行时应为数据载到了缓冲区内,所以快了不少。而打开行列存自动引流功能之后,这条语句的执行在use_imci_engine为off时执行用时就不低于10s了。

4.2 多表join查询

mysql>set use_imci_engine =on;Query OK,0 rows affected (0.00 sec)mysql>select->      l_orderkey,->      sum(l_extendedprice *(1- l_discount))as revenue,->      o_orderdate,->      o_shippriority
->from->      customer,->      orders,->      lineitem
->where->      c_mktsegment ='BUILDING'->and c_custkey = o_custkey
->and l_orderkey = o_orderkey
->and o_orderdate <date '1995-03-15'->and l_shipdate >date '1995-03-15'->groupby->      l_orderkey,->      o_orderdate,->      o_shippriority
->orderby->      revenue desc,->      o_orderdate
->limit10;+------------+-------------+-------------+----------------+| l_orderkey | revenue     | o_orderdate | o_shippriority |+------------+-------------+-------------+----------------+|2456423|406181.0111|1995-03-05|0||3459808|405838.6989|1995-03-04|0||492164|390324.0610|1995-02-19|0||1188320|384537.9359|1995-03-09|0||2435712|378673.0558|1995-02-26|0||4878020|378376.7952|1995-03-12|0||5521732|375153.9215|1995-03-13|0||2628192|373133.3094|1995-02-22|0||993600|371407.4595|1995-03-05|0||2300070|367371.1452|1995-03-13|0|+------------+-------------+-------------+----------------+10 rows inset(0.75 sec)

use_imci_engine设置为on,执行时间为0.75秒,执行计划如下:

mysql> explain select l_orderkey, sum(l_extendedprice *(1- l_discount))as revenue, o_orderdate, o_shippriority from customer, orders, lineitem where c_mktsegment ='BUILDING'and c_custkey = o_custkey and l_orderkey = o_orderkey and o_orderdate <date '1995-03-15'and l_shipdate >date '1995-03-15'groupby l_orderkey, o_orderdate, o_shippriority orderby revenue desc, o_orderdate limit10\G;***************************1. row ***************************IMCI Execution Plan (max_dop =2, max_query_mem =428867584):Project | Exprs: temp_table4.lineitem.l_orderkey, temp_table4.SUM(lineitem.l_extendedprice*1.00- lineitem.l_discount), temp_table4.orders.o_orderdate, temp_table4.orders.o_shippriority  TopK |Limit=10| Exprs: temp_table4.SUM(lineitem.l_extendedprice*1.00- lineitem.l_discount)DESC,temp_table4.orders.o_orderdateASC    HashGroupby | OutputTable(4): temp_table4 | Grouping: lineitem.l_orderkey orders.o_orderdate orders.o_shippriority| Output Grouping: lineitem.l_orderkey, orders.o_orderdate, orders.o_shippriority| Aggrs: SUM(lineitem.l_extendedprice*1.00- lineitem.l_discount)      HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.o_orderkey= lineitem.l_orderkey        HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.o_custkey= customer.c_custkey          CTableScan | InputTable(0): orders | Pred:(orders.o_orderdate<03/15/199500:00:00.000000)          CTableScan | InputTable(1): customer | Pred:(customer.c_mktsegment="BUILDING")        CTableScan | InputTable(2): lineitem | Pred:(lineitem.l_shipdate>03/15/199500:00:00.000000)1 row inset(0.03 sec)

从执行计划来看,执行的hashjoin,看一下use_imci_engine为off时的执行时间

mysql>select->      l_orderkey,->      sum(l_extendedprice *(1- l_discount))as revenue,->      o_orderdate,->      o_shippriority
->from->      customer,->      orders,->      lineitem
->where->      c_mktsegment ='BUILDING'->and c_custkey = o_custkey
->and l_orderkey = o_orderkey
->and o_orderdate <date '1995-03-15'->and l_shipdate >date '1995-03-15'->groupby->      l_orderkey,->      o_orderdate,->      o_shippriority
->orderby->      revenue desc,->      o_orderdate
->limit10;+------------+-------------+-------------+----------------+| l_orderkey | revenue     | o_orderdate | o_shippriority |+------------+-------------+-------------+----------------+|2456423|406181.0111|1995-03-05|0||3459808|405838.6989|1995-03-04|0||492164|390324.0610|1995-02-19|0||1188320|384537.9359|1995-03-09|0||2435712|378673.0558|1995-02-26|0||4878020|378376.7952|1995-03-12|0||5521732|375153.9215|1995-03-13|0||2628192|373133.3094|1995-02-22|0||993600|371407.4595|1995-03-05|0||2300070|367371.1452|1995-03-13|0|+------------+-------------+-------------+----------------+10 rows inset(19.69 sec)

执行时间为19.69秒,执行计划如下:

mysql> explain select l_orderkey, sum(l_extendedprice *(1- l_discount))as revenue, o_orderdate, o_shippriority from customer, orders, lineitem where c_mktsegment ='BUILDING'and c_custkey = o_custkey and l_orderkey = o_orderkey and o_orderdate <date '1995-03-15'and l_shipdate >date '1995-03-15'groupby l_orderkey, o_orderdate, o_shippriority orderby revenue desc, o_orderdate limit10;+----+-------------+----------+------------+--------+---------------+---------+---------+--------------------------+---------+----------+----------------------------------------------+| id | select_type |table| partitions | type   | possible_keys | key     | key_len | ref                      | rows    | filtered | Extra                                        |+----+-------------+----------+------------+--------+---------------+---------+---------+--------------------------+---------+----------+----------------------------------------------+|1| SIMPLE      | orders   |NULL| ALL    | PRIMARY       |NULL|NULL|NULL|1490641|33.33| Using where; Using temporary; Using filesort ||1| SIMPLE      | customer |NULL| eq_ref | PRIMARY       | PRIMARY |8| tpch1g.orders.o_custkey|1|10.00| Using where||1| SIMPLE      | lineitem |NULL| ref    | PRIMARY       | PRIMARY |8| tpch1g.orders.o_orderkey|4|33.33| Using where|+----+-------------+----------+------------+--------+---------------+---------+---------+--------------------------+---------+----------+----------------------------------------------+3 rows inset,1 warning (0.00 sec)

从执行计划来看,执行的是MySQL的嵌套join,执行时间长了不少。

4.3 点查

mysql>set use_imci_engine =on;Query OK,0 rows affected (0.00 sec)mysql>select*from lineitem where l_orderkey =1;+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+-------------------+------------+------------------------------------+| l_orderkey | l_partkey | l_suppkey | l_linenumber | l_quantity | l_extendedprice | l_discount | l_tax | l_returnflag | l_linestatus | l_shipdate | l_commitdate | l_receiptdate | l_shipinstruct    | l_shipmode | l_comment                          |+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+-------------------+------------+------------------------------------+|1|155190|7706|1|17.00|21168.23|0.04|0.02| N            | O            |1996-03-13|1996-02-12|1996-03-22| DELIVER IN PERSON | TRUCK      | egular courts above the            ||1|67310|7311|2|36.00|45983.16|0.09|0.06| N            | O            |1996-04-12|1996-02-28|1996-04-20| TAKE BACK RETURN  | MAIL       | ly final dependencies: slyly bold  ||1|63700|3701|3|8.00|13309.60|0.10|0.02| N            | O            |1996-01-29|1996-03-05|1996-01-31| TAKE BACK RETURN  | REG AIR    | riously. regular, express dep      ||1|2132|4633|4|28.00|28955.64|0.09|0.06| N            | O            |1996-04-21|1996-03-30|1996-05-16| NONE              | AIR        | lites. fluffily even de            ||1|24027|1534|5|24.00|22824.48|0.10|0.04| N            | O            |1996-03-30|1996-03-14|1996-04-01| NONE              | FOB        |  pending foxes. slyly re           ||1|15635|638|6|32.00|49620.16|0.07|0.02| N            | O            |1996-01-30|1996-02-07|1996-02-03| DELIVER IN PERSON | MAIL       | arefully slyly ex                  |+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+-------------------+------------+------------------------------------+6 rows inset(0.00 sec)mysql> explain select*from lineitem where l_orderkey =1;+----+-------------+----------+------------+------+---------------+---------+---------+-------+------+----------+-------+| id | select_type |table| partitions | type | possible_keys | key     | key_len | ref   | rows | filtered | Extra |+----+-------------+----------+------------+------+---------------+---------+---------+-------+------+----------+-------+|1| SIMPLE      | lineitem |NULL| ref  | PRIMARY       | PRIMARY |8| const |6|100.00|NULL|+----+-------------+----------+------------+------+---------------+---------+---------+-------+------+----------+-------+1 row inset,1 warning (0.01 sec)

在use_imci_engine设置为on时,点查仍然走的是MySQL的执行计划,不是IMCI Execution Plan。

5 小结

PolarDB myslq的启行存/列存自动引流把分析性的查询分流到只读列存实例上,把OLTP类的查询引流到主节点或者是只读节点。列存节点的存储方式更适合OLAP类查询,同时也能执行hash连接、合并排序连接等更适合分析性查询的多表连接方式,也支持并行执行,分析性的查询性能会有大幅度的提升。






相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
8月前
|
关系型数据库 分布式数据库 数据库
瑶池数据库大讲堂|PolarDB HTAP:为在线业务插上实时分析的翅膀
瑶池数据库大讲堂介绍PolarDB HTAP,为在线业务提供实时分析能力。内容涵盖MySQL在线业务的分析需求与现有解决方案、PolarDB HTAP架构优化、针对分析型负载的优化(如向量化执行、多核并行处理)及近期性能改进和用户体验提升。通过这些优化,PolarDB HTAP实现了高效的数据处理和查询加速,帮助用户更好地应对复杂业务场景。
278 4
|
8月前
|
Cloud Native 关系型数据库 MySQL
无缝集成 MySQL,解锁秒级数据分析性能极限
在数据驱动决策的时代,一款性能卓越的数据分析引擎不仅能提供高效的数据支撑,同时也解决了传统 OLTP 在数据分析时面临的查询性能瓶颈、数据不一致等挑战。本文将介绍通过 AnalyticDB MySQL + DTS 来解决 MySQL 的数据分析性能问题。
|
监控 关系型数据库 分布式数据库
【PolarDB 开源】PolarDB HTAP 实践:混合事务与分析处理的性能优化策略
【5月更文挑战第21天】PolarDB开源后在HTAP领域表现出色,允许在同一系统处理事务和分析工作负载,提高数据实时性。通过资源分配、数据分区、索引优化等策略提升性能。示例代码展示了创建和查询事务及分析表的基本操作。PolarDB还提供监控工具,帮助企业优化系统并应对业务变化。其HTAP能力为开发者和企业提供了强大支持,推动技术进步,加速数字化时代的业务发展。
508 1
|
前端开发 数据挖掘 关系型数据库
基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui
本文介绍了一个基于Python的哔哩哔哩数据分析系统,该系统使用Flask框架、MySQL数据库、echarts数据可视化技术和Layui前端框架,旨在提取和分析哔哩哔哩用户行为数据,为平台运营和内容生产提供科学依据。
929 9
|
存储 SQL 人工智能
AnalyticDB for MySQL:AI时代实时数据分析的最佳选择
阿里云云原生数据仓库AnalyticDB MySQL(ADB-M)与被OpenAI收购的实时分析数据库Rockset对比,两者在架构设计上有诸多相似点,例如存算分离、实时写入等,但ADB-M在多个方面展现出了更为成熟和先进的特性。ADB-M支持更丰富的弹性能力、强一致实时数据读写、全面的索引类型、高吞吐写入、完备的DML和Online DDL操作、智能的数据生命周期管理。在向量检索与分析上,ADB-M提供更高检索精度。ADB-M设计原理包括分布式表、基于Raft协议的同步层、支持DML和DDL的引擎层、高性能低成本的持久化层,这些共同确保了ADB-M在AI时代作为实时数据仓库的高性能与高性价比
|
存储 数据采集 数据可视化
基于Python flask+MySQL+echart的电影数据分析可视化系统
该博客文章介绍了一个基于Python Flask框架、MySQL数据库和ECharts库构建的电影数据分析可视化系统,系统功能包括猫眼电影数据的爬取、存储、展示以及电影评价词云图的生成。
675 1
|
存储 关系型数据库 分布式数据库
PolarDB IMCI助力云学堂实现高效HTAP系统
云学堂数据库全量使用PolarDB,成本节约30%以上
325 0
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
715 4
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
210 2

推荐镜像

更多