本文会深入介绍PolarDBMySQL在并行查询这一企业级查询加速特性上做的技术探索、形态演进和相关组件的实现原理,所涉及功能随PolarDBMySQL8.0.版本上线。
一背景
PolarDB
云的兴起为古老而顽固的数据库市场带来了新的发展机遇,据Gartner预测,到0年,所有数据库中将有75%部署或迁移到云平台,云原生数据库的诞生为各个数据库厂商、云服务供应商提供了弯道超车的绝好机遇,看一下AWS在Re:invent00发布的Babelfish,就能嗅到它在数据库市场的野心有多大。
AWS在07年发表的关于Aurora的这篇paper[],引领了云原生关系型数据库的发展趋势,而作为国内最早布局云计算的厂商,阿里云也在08年推出了自己的云原生关系数据库PolarDB,和Aurora的理念一致,PolarDB深度融合了云上基础设施,目标是在为客户提供云上特有的扩展性、弹性、高可用性的同时,能够具备更低的响应延迟和更高的并发吞吐,其基本架构如下:
底层的分布式共享存储突破了单机存储容量的限制,而且可以随用户的数据量增长自动弹性扩容,计算层则是一写多读的典型拓扑,利用RDMA提供的高速远程访问能力来抵消计算存储分离带来的额外网络开销。
挑战
从上图可以看到,存储层将允许远大于单机的数据容量(目前是8T),甚至线上会出现一些用户,单表容量达到xxT的级别,这在基于MySQL主从复制的传统部署中是难以想象的。同时大量用户会有对业务数据的实时分析诉求,如统计、报表等,但大家对MySQL的直观印象就是:小事务处理快,并发能力强,分析能力弱,对于这些实时性分析查询,该如何应对呢?
方案
首先要说的是,随着互联网的发展,数据量的爆炸,一定的数据分析能力、异构数据的处理能力开始成为事务型数据库的标配,MySQL社区在8.0版本中也对自身的查询处理能力做了补强,包括对子查询的transformation、hashjoin、windowfunction支持等,同时PolarDBMySQL优化器团队也做了大量工作来提升对复杂查询的处理能力,如统计信息增强、子查询更多样的transformation、querycache等。
并行查询(ParallelQuery)是PolarDBMySQL在推出伊始就配备的查询加速功能,本质上它解决的就是一个最核心的问题:MySQL的查询执行是单线程的,无法充分利用现代多核大内存的硬件资源。通过多线程并行执行来降低包括IO以及CPU计算在内的处理时间,来实现响应时间的大幅下降。毕竟,对于用户来说,一条查询如果可以分钟用0个核完成,总比0分钟用个核完成更有意义。此外所有成熟的商业型数据库也都具备并行查询的能力。
二并行查询介绍
特性
并行查询可以说是PolarDBMySQL在计算层最为重要复杂度也最高的功能组件,随着PolarDB的推出已经线上稳定运行多年,而且一直在持续演进,它具备如下几个特性:
完全基于MySQLcodebase,原生的MySQL00%兼容,这里包括
语法兼容类型兼容行为兼容0附加成本,随产品发布就携带的功能
无需额外存储资源无需额外计算节点0维护成本,使用和普通查询没有任何差别,只是响应变快了
随集群部署,开箱即用对业务无侵入单一配置参数(并行度)实时性分析,PolarDB原生的一部分,受惠于REDO物理复制的低延迟
统一底层事务型数据提交即可见极致性能,随着PQ的不断完善,对于分析型算子、复杂查询结构的支持能力不断提升
全算子并行高效流水线复杂SQL结构支持稳定可靠,作为企业级特性,这个毋庸置疑
扩展MySQL测试体系线上多年积累完备诊断体系
上面这些听起来像是广告宣传词,但也确实是并行查询的核心竞争力。
演进
并行查询的功能是持续积累起来的,从最初的PQ.0到PQ.0,目前进入了跨节点并行的研发阶段并且很快会上线发布,这里我们先不介绍跨节点并行能力,只