Polardb-X 多存储节点下sql执行计划

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 在单机上创建polardb-X两存储节点集群,查看执行计划

1 检查现有集群

(venv) [root@my_ob ~]# pxd list

         /root/venv/lib64/python3.6/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release.

           from cryptography.hazmat.backends import default_backend

         /root/venv/lib/python3.6/site-packages/deployer

         NAME                          CN        DN        CDC       STATUS

         pxc-tryout                    1         1         1         running

2 清除现有集群

这一步会清楚已创建的所有Polardb-X集群,要谨慎使用。

(venv) [root@my_ob ~]# pxd cleanup

         /root/venv/lib64/python3.6/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release.

           from cryptography.hazmat.backends import default_backend

         /root/venv/lib/python3.6/site-packages/deployer

         Prepare to delete all PolarDB-X clusters

         All PolarDB-X clusters will be deleted, do you want to continue? [y/N]: y

         Prepare to delete PolarDB-X cluster: pxc-tryout

         stop and remove container: pxc-tryout-cn-bLzM, id: b4b29949a0 at 127.0.0.1

         stop and remove container: pxc-tryout-cdc-LJhR, id: 2fa39a46f4 at 127.0.0.1

         stop and remove container: pxc-tryout-gms-Cand-17077, id: e930288c58 at 127.0.0.1

         stop and remove container: pxc-tryout-dn-0-Cand-14508, id: 1bd0be8eb6 at 127.0.0.1

3 重新创建一个两个DN节点的集群

(venv) [root@my_ob ~]pxd tryout -cn_replica 1 -cn_version latest -dn_replica 2 -dn_version latest -cdc_replica 1 -cdc_version latest

     latest:Pulling from docker.io/polardbx/xstore-tools

     Digest: sha256:b061e1dd57380b455804c091df583708204fa292776e02a0e005d617b59b5d82

     Status: Image is up to date for docker.io/polardbx/xstore-tools:latest

     Processing  [#########---------------------------]   25%    create gms node

     Processing  [############------------------------]   33%    create gms db and tables

     Processing  [###############---------------------]   41%    create PolarDB-X root account

     Processing  [##################------------------]   50%    create dn

     Processing  [#####################---------------]   58%    register dn to gms

     Processing  [########################------------]   66%    create cn

     Processing  [###########################---------]   75%    wait cn ready

     Processing  [##############################------]   83%    create cdc containers

     Processing  [#################################---]   91%    wait PolarDB-X ready

     Processing  [####################################]  100%

     PolarDB-X cluster create successfully, you can try it out now.

     Connect PolarDB-X using the following command:

         mysql -h127.0.0.1 -P11058 -upolardbx_root -pHOxcSLDj

4 连接至集群,用的是obclient客户端,创建数据库,测试表,插入数据

obclient -h127.0.0.1 -P11058 -upolardbx_root -pHOxcSLDj

MySQL [(none)]> show databases;

     +--------------------+

     | DATABASE           |

     +--------------------+

     | information_schema |

     +--------------------+

     1 row in set (0.004 sec)

看一下计算节点状态

MySQL [(none)]> show mpp;

     +------------+------------------+------+--------+

     | ID         | NODE             | ROLE | LEADER |

     +------------+------------------+------+--------+

     | pxc-tryout | 172.17.0.5:11060 | W    | Y      |

     +------------+------------------+------+--------+

     1 row in set (0.007 sec)

看一下存储节点状态,有三个存储节点,一个是gms

MySQL [(none)]> show storage;

     +-----------------+------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+

     | STORAGE_INST_ID | LEADER_NODE      | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT | STATUS | DELETABLE | DELAY | ACTIVE |

     +-----------------+------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+

     | pxc-tryout-dn-0 | 172.17.0.3:14308 | true       | MASTER    | 1        | 2           | 0      | false     | null  | null   |

     | pxc-tryout-dn-1 | 172.17.0.4:16306 | true       | MASTER    | 1        | 1           | 0      | true      | null  | null   |

     | pxc-tryout-gms  | 172.17.0.2:16456 | true       | META_DB   | 2        | 2           | 0      | false     | null  | null   |

     +-----------------+------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+

     3 rows in set (0.038 sec)

创建测试库

MySQL [(none)]> create database test partition_mode='partitioning';

     Query OK, 1 row affected (1.280 sec)

进入测试库

MySQL [(none)]> use test;

     Database changed

创建测试表,用hash分区,分区数同计算节点数

MySQL [test]> create table emp (  

 `id` bigint(11) auto_increment NOT NULL,

 `name` varchar(255) DEFAULT NULL,

 `dept_no` int,

 `salary` bigint(10),

 primary key (`id`) ) engine=InnoDB default charset=utf8  

 partition by hash(id)  partitions 2;

 Query OK, 0 rows affected (5.045 sec)

插入四行数据

MySQL [test]> insert into emp(name,dept_no,salary) values ('tom', 1, 3000),('jack', 2, 3100), ('john', 4, 2900),('zhangsan',2,2800);

 Query OK, 4 rows affected (0.382 sec)

 

检查一下数据

MySQL [test]> select * from emp;

 +--------+----------+---------+--------+

 | id     | name     | dept_no | salary |

 +--------+----------+---------+--------+

 | 100001 | tom      |       1 |   3000 |

 | 100004 | zhangsan |       2 |   2800 |

 | 100002 | jack     |       2 |   3100 |

 | 100003 | john     |       4 |   2900 |

 +--------+----------+---------+--------+

 4 rows in set (0.593 sec)

看一下表拓扑,表数据分布到两个节点上

MySQL [test]> show topology from emp;

 +----+-------------------+----------------+----------------+

 | ID | GROUP_NAME        | TABLE_NAME     | PARTITION_NAME |

 +----+-------------------+----------------+----------------+

 |  0 | TEST_P00001_GROUP | emp_kfYc_00001 | p2             |

 |  1 | TEST_P00000_GROUP | emp_kfYc_00000 | p1             |

 +----+-------------------+----------------+----------------+

 2 rows in set (0.008 sec)

5 查看执行计划

MySQL [test]> explain select * from emp;

 +----------------------------------------------------------------------------------------------------------------------+

 | LOGICAL EXECUTIONPLAN                                                                                                |

 +----------------------------------------------------------------------------------------------------------------------+

 | Gather(concurrent=true)                                                                                              |

 |   LogicalView(tables="emp[p1,p2]", shardCount=2, sql="SELECT `id`, `name`, `dept_no`, `salary` FROM `emp` AS `emp`") |

 | HitCache:true                                                                                                        |

 | Source:PLAN_CACHE                                                                                                    |

 | TemplateId: d3a01e16                                                                                                 |

 +----------------------------------------------------------------------------------------------------------------------+

 5 rows in set (0.288 sec)

上面是逻辑执行计划,logicalview下推到存储节点执行,访问了两个分区,在两个分片上执行,然后在计算节点汇总,可以并行执行。

MySQL [test]> explain execute select * from emp;

     +----------+-------------+-------+------------+------+---------------+-----+---------+-----+----------+----------+-------+

     | id       | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows     | filtered | Extra |

     +----------+-------------+-------+------------+------+---------------+-----+---------+-----+----------+----------+-------+

     |         | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |         | 100      | NULL  |

     +----------+-------------+-------+------------+------+---------------+-----+---------+-----+----------+----------+-------+

     1 row in set (0.090 sec)

explain execute 选项用来查看物理执行计划,输出上面如上图,物理执行计划是在存储节点执行的,同MySQL的执行计划相同。

MySQL [test]> explain select * from emp where name='zhangsan';

     +-----------------------------------------------------------------------------------------------------------------------------------------+

     | LOGICAL EXECUTIONPLAN                                                                                                                   |

     +-----------------------------------------------------------------------------------------------------------------------------------------+

     | Gather(concurrent=true)                                                                                                                 |

     |   LogicalView(tables="emp[p1,p2]", shardCount=2, sql="SELECT `id`, `name`, `dept_no`, `salary` FROM `emp` AS `emp` WHERE (`name` = ?)") |

     | HitCache:true                                                                                                                           |

     | Source:PLAN_CACHE                                                                                                                       |

     | TemplateId: decd96f4                                                                                                                    |

     +-----------------------------------------------------------------------------------------------------------------------------------------+

     5 rows in set (0.032 sec)

加个where条件删选一下,name列上没有任何索引,也不是主键,仍然需要访问两个存储节点,数据在计算节点汇总。

MySQL [test]> explain select * from emp where id=100001;

     +--------------------------------------------------------------------------------------------------------------------+

     | LOGICAL EXECUTIONPLAN                                                                                              |

     +--------------------------------------------------------------------------------------------------------------------+

     | LogicalView(tables="emp[p1]", sql="SELECT `id`, `name`, `dept_no`, `salary` FROM `emp` AS `emp` WHERE (`id` = ?)") |

     | HitCache:false                                                                                                     |

     | Source:PLAN_CACHE                                                                                                  |

     | TemplateId: f0ccb8c4                                                                                               |

     +--------------------------------------------------------------------------------------------------------------------+

     4 rows in set (0.096 sec)

   

以主键作为查询条件,只需要访问一下分区,计算节点也不需要做汇总,可以看出polardb-x具备水平分表能力,可以提高并发读写能力。

MySQL [test]> explain execute select * from emp where id=100001;

     +----------+-------------+-------+------------+-------+---------------+---------+---------+-------+----------+----------+-------+

     | id       | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows     | filtered | Extra |

     +----------+-------------+-------+------------+-------+---------------+---------+---------+-------+----------+----------+-------+

     |         | SIMPLE      | emp   | NULL       | const | PRIMARY       | PRIMARY | 8       | const |         | 100      | NULL  |

     +----------+-------------+-------+------------+-------+---------------+---------+---------+-------+----------+----------+-------+

     1 row in set (0.011 sec)

节点上执行的物理计划,使用了主键,同MySQL相同。

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
4月前
|
存储 SQL 运维
“震撼发布!PolarDB-X:云原生分布式数据库巨擘,超高并发、海量存储、复杂查询,一网打尽!错过等哭!”
【8月更文挑战第7天】PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
111 1
|
5月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之主节点和列存节点的执行计划相同,而只读行存节点的执行计划不同,是什么原因
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 运维 关系型数据库
PolarDB产品使用问题之在删除主节点上的表后尝试查询归档表遇到问题,该如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
运维 关系型数据库 分布式数据库
PolarDB产品使用问题之将部分表设置为压缩表,是否会对节点的整体性能影响
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之将RDS切换到PolarDB-X 2.0时,代码层的SQL该如何改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
关系型数据库 Serverless 分布式数据库
PolarDB产品使用问题之inplace方式是否支持集群所有节点的弹性扩容
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题
【7月更文挑战第3天】PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题。此架构让存储层专注数据可靠性,计算层专注处理SQL,提升性能并降低运维复杂度。通过RDMA加速通信,多副本确保高可用性。资源可独立扩展,便于成本控制。动态添加计算节点以应对流量高峰,展示了其灵活性。PolarDB的开源促进了数据库技术的持续创新和发展。
300 2
|
6月前
|
运维 关系型数据库 MySQL
PolarDB产品使用问题之多主集群配置多个全局只读节点最多可增加到多少个
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 SQL 数据库
MySQL设计规约问题之为何推荐用DECIMAL代替FLOAT和DOUBLE来存储精确浮点数
MySQL设计规约问题之为何推荐用DECIMAL代替FLOAT和DOUBLE来存储精确浮点数
|
6月前
|
存储 关系型数据库 分布式数据库
PolarDB操作报错合集之修改了binlog的存储时间为1小时,但在重启后发现仍有90GB的binlog文件未被删除,是什么原因
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。