一种提升SQL改写效率的方法

天翼云开发者社区
• 阅读 98

本文分享自天翼云开发者社区《一种提升SQL改写效率的方法》,作者:唐****律

一、背景 SQL改写是数据库产品中使用比较频繁的一个技术,在大多数产品中的调用频率也非常高,通常对性能的需求需要接近对应数据库产品的上限。例如在天翼云关系型数据库中的Mysql语法兼容组件,其性能测试标准需要达到接近30万TPS,也意味着SQL改写环节的性能标准需要支持至少每秒30万次以上,否则会成为系统的性能瓶颈。

SQL改写的基础是抽象语法树,而抽象语法树则是由SQL字符串经过词法分析和语法分析之后得到的。词法分析器和语法分析器在市面上有非常多的种类可供挑选,例如Lexer、YACC、Antlr、Druid等,一般数据库产品都只在其基础上进行SQL改写,例如基于C语言开发的PG的分布式数据库插件Citus。对于一些Java语言开发的数据库产品,SQL解析的性能则会有所下降,有的数据库会在此基础上再进行优化,例如分布式数据库Mycat,则是在Druid的基础上再加入了一个SQL缓存,用以减轻SQL解析和改写的代价。但是这对于一些对于SQL改写需求特别大或者请求语句特别复杂的数据库产品来说还是不够的,例如在天翼云关系型数据库中的Mysql语法兼容组件中,SQL改写过程中需要进行元数据收集、类型推断、通配符分析、子查询和嵌套查询处理、别名分析和修正、类型适配、隐式类型转换、系统参数计算、以及近50条语法兼容规则,这样一来,每次进行SQL改写就是一个非常大的开销,因此需要对SQL改写环节进行性能优化。

对于此类问题,业界也有一些的解决方案,例如分布式数据库Mycat,它使用缓存对SQL改写进行性能优化,以SQL为key对抽象语法树进行缓存,减轻了部分SQL解析的负担,特点是缓存命中率低,性能提升有限,消耗内存大。

二、方案 本方案以提高解析能力为目标,从缓存方向出发,考虑如何提高缓存命中率,以减少不必要的性能消耗。结合应用在使用SQL的过程中的主体结构不轻易改变的特性,使用参数化SQL作为缓存key,处理过程中预先对SQL进行词法分析,分解为参数化SQL和参数列表,并以参数化SQL为key对抽象语法树进行缓存。如果缓存未命中,则对参数化SQL依次进行词法分析、语法分析、改写处理,最后在改写完毕之后,再结合先前记录的参数生成目标SQL,即完成完整的SQL改写过程。

这个方案减少了大部分的性能消耗,缓存命中率高,内存消耗小,大幅提升了性能,其核心逻辑是以额外的性能消耗极小的词法分析和参数化环节为代价,大幅缩短了性能消耗极高的抽象语法树改写过程。

需要注意的是,该方案的应用对改写环节提出了更高的要求,开发者需要预见参数在整个改写过程中的作用并进行正确的处理。举例来说,在分布式数据库中有一些SQL改写,需要依据过滤条件的值的hash值,来决定将哪些SQL分发到哪些数据节点,这个时候由于过滤条件的值已被参数化,所以SQL改写过程中就不能直接决定其需要分发的节点了,而是要改为在最后结合参数生成目标SQL的时候计算分发的节点。

三、优点 本方案提出一种提升SQL改写效率的方法,通过预先对SQL进行词法分析,分解为参数化SQL和参数列表,并以参数化SQL为key对抽象语法树进行缓存,然后进行抽象语法树改写,最后再结合参数列表生成目标SQL,大幅提升了缓存命中率和SQL改写效率。

经过相同环境下的测试对比,可知本方案在提高SQL改写效率方面产生了巨大的提升,并且由于测试样本较少,缓存命中率更高的方案显然会在实际应用场景中获得更大的优势。表1为3种方案对于SQL改写的性能对比:从天翼云云电脑生产环境中随机摘取100万条数据对其进行Mysql语法到PostgreSQL语法的改写,在Intel Core i7-6700 CPU 和24GB内存的测试环境下,各使用10个线程分别按上述3个方案进行测试。

点赞
收藏
评论区
推荐文章
Karen110 Karen110
2年前
一篇文章带你了解Django ORM操作(基础篇)
前言在日常开发中,需要大量对数据库进行增删改查操作。如果头铁的话,使用原生SQL是最好的,毕竟性能又高,又灵活。但是通常情况下,我们不是太需要那么苛刻的性能,也没有那么多刁钻的需求用原生SQL通常会使用简单快捷的ORM进行增删改查一起看学习一下Django的ORM操作吧表结构设计还是从实际角度出发。假设,现在我需要设计一个简单的图书管理系统,是那种买的书,不
TiDB与MySQL的SQL差异及执行计划简析
TiDB作为NewSQL,其在对MySQL(SQL92协议)的兼容上做了很多,MySQL作为当下使用较广的事务型数据库,在IT界尤其是互联网间使用广泛,那么对于开发人员来说,1)两个数据库产品在SQL开发及调优的过程中,都有哪些差异?在系统迁移前需要提前做哪些准备?2)TiDB的执行计划如何查看,如何SQL调优?本文做了一个简要归纳,欢迎查阅交流。
Stella981 Stella981
2年前
Redis01——Redis介绍
1、NoSQL数据库概述  NoSQL(NoSQLNotOnlySQL),意即“不仅仅是SQL”,泛指非关系型的数据库。  NoSQL不依赖业务逻辑方式存储,而以简单的keyvalue模式存储。因此大大的增加了  数据库的扩展能力  特点:不遵循SQL标准,不支持ACID,远超于SQL的性能  适
Stella981 Stella981
2年前
Hibernate之二级缓存
一:二级缓存简介为什么需要缓存:      查询大量数据时更快,拉高程序的性能什么样的数据需要缓存:      很少被修改或根本不改的数据数据字典业务场景比如:耗时较高的统计分析sql、电话账单查询sql等关系型数据库:数据与数据之间存在关系(联系)的数据库mysql/Oracle
Stella981 Stella981
2年前
Redis的认识和基本操作
 Redis是什么Redis是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存中。Redis是以keyvalue形式存储的Nosql,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,非关系型数据库严格上不是一种数据库,应该是一种数据结构
Wesley13 Wesley13
2年前
MySQL性能优化的最佳20+条经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面
京东云开发者 京东云开发者
3星期前
Sql优化之回表
前言:MySQL的性能是大家在使用时十分关心的问题,比如在高并发访问时,并且有慢sql存在的情况下,MySQL的性能会明显下降,这会导致数据库响应时间变慢,甚至导致数据库宕机。那么为了避免Mysql性能问题,比较常用的方式创建适当的索引,提升sql语句的执
NewSQL数据库产品介绍及其优点
NewSQL是各种新型可伸缩高性能SQL数据库的简称。它在分布式架构中发挥关系模型的优势,从一开始就考虑SQL函数,精简传统关系数据库中不必要的组件,提高效率。所以NewSQL数据库(https://www.oceanbase.com/)几乎可以无
新支点小星 新支点小星
3个月前
CNAS中兴新支点——软件测试中的非功能测试包含哪些测试内容
软件测试中的非功能测试是指对软件产品在功能之外的其他特性进行测试,包括性能测试、可靠性测试、安全性测试、易用性测试、可维护性测试等。1、性能测试:性能测试是对软件产品在特定条件下的性能进行测试和评估。包括负载测试、强度测试、数据库容量测试等。通过模拟不同的
新支点小玉 新支点小玉
3个月前
软件测试中的非功能测试包括什么?
软件测试中的非功能测试是指对软件产品在功能之外的其他特性进行测试,包括性能测试、可靠性测试、安全性测试、易用性测试、可维护性测试等。1、性能测试:性能测试是对软件产品在特定条件下的性能进行测试和评估。包括负载测试、强度测试、数据库容量测试等。通过模拟不同的
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
494
粉丝
8
获赞
37