MySQL查询优化分析文章:
前言
在前面的文章中,讲述了社区MySQL查询优化概念和分析。MySQL作为一个广泛使用的开源数据库,其在查询优化基础能力上有着不错的表现,对很多场景也做了比较极致的优化。不过MySQL在充分利用当前硬件资源做查询加速,复杂的查询处理上也还有着一些欠缺。例如社区MySQL单查询只能使用一个线程执行,无法并行执行,无法充分利用CPU资源;不支持列存、SIMD指令加速;对复杂的查询缺少基于代价的查询变换能力。
随着社会数字化的不断发展,企业的业务规模、业务模式不断发展,企业业务需要存储与处理的数据量越来越大。PolarDB MySQL作为一款存算分离的云原生数据库,各类大中小客户都可以充分享受其带来的技术优势、成本优势。其中很多企业存储的数据量对比社区MySQL用户有着数量级上的增加,一些客户在一个实例中会存储几百T数据。同时PolarDB MySQL有非常多企业级特性,吸引各个行业的客户使用,很多客户有着复杂的SQL使用场景或者分析场景。在这样的背景下,PolarDB MySQL中做了大量企业级查询加速与优化功能,使得客户能够充分利用硬件资源、特性,能够更好的处理复杂查询,解决各类突发问题。而且PolarDB MySQL完全兼容MySQL,客户无需任何业务修改即可使用这些功能,不需担心业务SQL被厂商绑定。

弹性并行执行(Elastic Parallel Query)
背景
PolarDB MySQL存算分离,突破了单机存储的限制,用户会存储几百T的数据。通过共享存储,可以快速拉起计算节点,获得极致的弹性能力。用户在PolarDB中存储数据量的增加,业务查询数据也不断增加。但是社区MySQL一直以来对于单个查询都只能够单线程执行,其在8.0版本中增加的并行也只能处理单表全量count(*)操作且有很多的限制与不足(这个场景PolarDB同时做了下推优化,比社区MySQL性能和表现更优)。

PolarDB的弹性并行执行(Elastic Parallel Query简称ePQ)能力,可以支持单机并行和多机并行,充分利用不断发展的硬件能力,通过客户的硬件资源加速用户查询。这样解决了慢查询的单核瓶颈,对客户一些轻分析查询可以快速返回结果,满足客户的实时性需求。

实现
PolarDB MySQL会基于代价选择并行执行计划,来避免性能的回退或者消耗大量计算资源却不能提升查询性能。同时PolarDB的ePQ支持Auto-DOP能力,会基于实例当前的负载、用户查询计算量、用户查询的加速比选择合适的并行度(degree)。这些可以使用户放心使用ePQ加速查询,而不必担心性能回退或者部分极端场景下计算资源使用的大幅增加导致系统负载过大而hang住。
ePQ基于代价选择合适的并行执行计划后,会对计划做clone并插入Exchange、Gather节点,对处理的数据做分片。这些数据分片会被启动的各个worker按轮询或者预分配方式消费处理。
最终数据会汇总到Leader节点返回给客户端。

效果
PolarDB的ePQ对各种类型的SQL都做了并行执行支持。32核单机并行,TPCH 100G的平均加速比达到17倍,最高加速比达到56倍(有部分计算下推优化)。4节点,TPCH 100G的平均加速在59倍,最高加速比达159倍。

使用
开启ePQ可以在集群地址配置中开启,通过访问地址开启并行执行。
也可以直接配置并行执行相关参数,相关参数如下:
max_parallel_degree配置并行度,默认值和规格相关。
parallel_degree_policy配置并行度策略。默认是REPLICA_AUTO仅只读节点并行且使用自动dop功能,如果希望各个节点一致,可以配置为AUTO。
cost_threshold_for_parallelism考虑并行执行的代价阈值。当查询的代价超过该阈值的时候才会考虑并行,默认值是50000。
列存索引(IMCI)
背景
虽然PolarDB有行存的并行执行,但一些客户场景,行存的执行性能无法满足其场景需求。这些查询往往有更大的数据分析量,有更高的查询返回时间要求。
PolarDB MySQL通过列存索引(In-Memory Column Index,简称IMCI)实现了一体化处理实时事务和实时数据分析能力。客户可以通过一套数据库同时满足业务TP和AP需求。其使用完全兼容MySQL,客户业务SQL不需要做任何修改。
实现
PolarDB IMCI支持了事务级别一致性的行列混合存储;向量化执行引擎,核心算子SIMD加速,充分利用硬件能力;完全兼容MySQL。
创建列存索引后,表上的数据修改、DDL都会应用到列存存储。客户查询语句可以通过指定连接地址发给列存执行,也可以直接通过集群地址由行列优化器基于代价自动选择执行引擎。对于AP查询,优化器能够自动识别,并转给AP的RO生成列存的执行计划执行。

效果
对TPCH 100G数据做性能对比测试。列存开启前后加速效果明显,部分语句可以达到百倍提升。

与ClickHouse对比,也有非常明显的性能优势,在Scan\Agg\Join上表现突出。

使用
在使用时,客户可以添加列存只读节点。

对需要创建列存索引的库、表添加列存索引。
-- 创建表COMMENT添加
CREATE TABLE t2(
col1 INT,
col2 DATETIME,
col3 VARCHAR(200)
) ENGINE InnoDB COMMENT 'COLUMNAR=1';
-- ALTER TABLE添加
ALTER TABLE t11 COMMENT 'COLUMNAR=1';
-- 表级添加
CREATE COLUMNAR INDEX ON <db_name>.<table_name>;
CREATE COLUMNAR INDEX ON <table_name>;
-- 库级别添加
CREATE COLUMNAR INDEX FOR TABLES IN <db_name>;
CREATE COLUMNAR INDEX FOR TABLES FROM <db_name>;
对于自动分流,参数loose_imci_ap_threshold是考虑列存执行的查询代价阈值,默认值是50000。




