OceanBase1.0版本开始至今,始终在MySQL兼容能力研发上投入了大量工作,并实现了SQL语法、数据类型、系统函数等全面的MySQL兼容能力。这对于不少将MySQL作为刚开始使用数据库首选的用户来说,无疑是重大利好。
随着MySQL的发展和用户使用需求的变化,OceanBase更是马不停蹄,对MySQL的兼容版本从5.6发展到5.7再到8.0,始终致力于为用户带来简单友好的开发体验。在这个过程中,也有用户好奇,OceanBase4.1对MySQL 8.0到底有哪些现实的意义呢?通过对窗口函数、公用表表达式、HashJoin、索引管理、资源管理五个角度加以分析,便可得到答案。
窗口函数,提高数据分析能力
窗口函数(WindowFunction)是MySQL8.0的新增功能,它可以对某个窗口内的数据行执行聚合操作,能更简单直观地进行时间序列分析、累积统计、排名等操作,帮助用户更深入地发现数据价值。窗口函数主要应用于数据分析,例如计算数据趋势变化、基于不同指标排序数据、复杂统计指标计算等。
由于窗口函数功能在OLAP使用场景广泛,OceanBase从1.x版本开始就提供了窗口函数功能。与此同时,数据库优化器可以有效地处理窗口函数,降低查询计算的成本。值得一提的是,即使用户在SQL编写中没有使用窗口函数,在部分场景中,OceanBase也会将部分SQL自动改写为包含窗口函数的语句,以提高性能。
公用表表达式,增强SQL可维护性
公共表表达式是由SQL1999标准引入的SQL功能,后续在2000年初各数据库厂商陆续推出此功能,MySQL在8.0推出了完备的公共表表达式实现。公共表表达式通过WITH关键字,允许在SQL语句中定义一个/多个临时表,并在查询中应用,通常应用在多个子查询、分层查询以及递归查询中。
用户借助公共表表达式可以将复杂的查询拆分为多个逻辑部分,使复杂查询的结构更清晰、SQL代码的逻辑更直观,使得查询更容易理解和维护,还可以通过递归公共表表达式实现更复杂的功能。
即使用户在SQL编写中未使用公共表表达式,OceanBase也会在改写阶段进行识别并抽取,通过减少子查询执行次数以优化性能。
HashJoin算法,提升大数据连接性能
HashJoin是数据库中广泛实现的连接(JOIN)算法,用于处理两个或多个表之间的连接操作。在HashJoin算法中,首先基于其中一个表构建Hash表(一般选择数据量小的表构建),然后对另一张表每一行进行Hash表探测,找到与之匹配的行并生成结果集,在数据量较大时通常有性能优势。
MySQL在8.0版本之前支持的连接算法只有NestedLoopJoin,这种连接算法在Web应用和OLTP场景中的性能已相对较好,因此未对HashJoin有很高的优先级。然而,当内表数据量较大且没有适合索引时,NestedLoopJoin性能较差。
基于此,OceanBase从研发初期就对HashJoin算法进行了支持,通过建索引优化NestedLoopJoin助力分布式场景下索引,从而实现较难达到的预期效果。同时,OceanBase也支持NestedLoopJoin以及MergeJoin,这两个Join算法在能利用索引或利用序的场景有性能优势。
索引管理,带来更高的管理效率
MySQL8.0引入了设置索引可见性(visiable/invisiable)的功能,这一功能允许用户在不删除索引的前提下,将索引设置为不可见,还可以安全地验证索引对查询性能的影响,从而避免资源浪费。此外,通过设置索引可见性,可以在不重建索引的情况下快速恢复索引,从而避免误删关键索引导造成性能下降的风险。综合来看,索引可见性设置可以帮助用户更灵活地管理索引策略、优化查询性能并降低资源浪费,从而提升数据库管理效率。
另外值得一提的是,MySQL8.0还新增了对逆序索引的支持。对于逆序排序的场景,OceanBase优化器会利用正序索引,并支持前缀排以及通过并行加速排序;对单列的逆序排序,OceanBase可以用逆序扫描索引的方式利用索引;对混合了正逆序的多列排序场景,OceanBase会尽可能的利用索引,在排序时只对不能利用索引的列进行排序。此外,如果建索引后此类排序性能仍不满足要求,可以尝试通过并行执行(PX)加速排序。
资源管理,提高数据有效利用率
MySQL8.0开始支持资源组功能,此功能可以指定资源组所使用的CPU资源以及任务调度优先级,从而对数据库查询的执行进行管理和控制。同时,可以通过语法为线程指定资源组,或通语句指定资源组,从而控制不同任务的资源使用、灵活地调整资源分配,从而提高资源的整体利用率。
从3.x版本开始,OceanBase在Oracle模式中支持了Oracle的资源管理,与MySQL的resourcemanagement主要针对CPU资源分配不同,OceanBase提供了丰富、灵活的资源管理策略,可以设置多种不同的资源计划,根据消耗情况动态调整资源分配,具备更完备的功能和更多的定制可能性。
除此之外,MySQL8.0还带来了如JSON类型增强、支持INTERSECT,EXPECT等功能特性,也解决了如AtomicDDL、自增值持久化等长期存在的不足,以及默认字符集由latin1变为utf8mb4,groupby列不再支持asc/desc等行为变化。在OceanBase不断优化对MySQL8.0的兼容性的过程中,还将缔造更多惊喜和优质体验。
领取专属 10元无门槛券
私享最新 技术干货