本文分享自天翼云开发者社区《一种提升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个方案进行测试。

一种提升SQL改写效率的方法的更多相关文章

  1. 提高SQL查询效率的30种方法

    转载:提高SQL查询效率的30种方法 内容摘录如下: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中 ...

  2. 提高SQL执行效率的16种方法

      项目中优化sql语句执行效率的方法:1)尽量选择较小的列2)将where中用的比较频繁的字段建立索引3)select子句中避免使用'*'4)避免在索引列上使用计算.not in 和<> ...

  3. 提升jmeter脚本编写效率的方法:Fiddler导出jmx文件

    有效提升编写JMeter脚本效率的方法 jmeter的脚本来源有以下几种:badboy录制.jmeter自带的录制功能.手动编写脚本(使用fiddler/wireshark来抓包,然后构造协议写脚本) ...

  4. lua中,两种json和table互转方法的效率比较

    lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据 ...

  5. [转]SQL三种获取自增长的ID方法

     最新更新请访问: http://denghejun.github.io   SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTIT ...

  6. 【老孟Flutter】6种极大提升Flutter开发效率的工具包

    老孟导读:本文介绍6种极大提升Flutter开发效率的工具包. [1] 强大的日志软件包 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面 ...

  7. 你用什么方法检查 PHP 脚本的执行效率(通常是脚本执行时间)和数据库 SQL 的效率(通常是数据库 Query 时间), 并定位和分析脚本执行和数据库查询的瓶颈所在?

    php: 一般是在你要检查的代码开头记录一个时间,结尾记录一个时间.取差值, 数据库SQL的效率    sql的explain(mysql),启用slow query log记录慢查询.   通常还要 ...

  8. 新三种求数列中值SQL之效率再比拼

    在  https://www.cnblogs.com/xiandedanteng/p/12677688.html 中我列举了三种求中值方案,其中日本人MICK的做法因为不适用于二百万结果集而放弃,取而 ...

  9. 关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比 ...

  10. SQl 执行效率总结

    SQL执行效率总结 1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2 ...

随机推荐

  1. Python网络爬虫之requests模块1

    Python网络爬虫之requests模块(1) 引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包 ...

  2. antlr的使用

    我从以下几个问题入手介绍ANTLR的相关知识. 1 ANTLR是什么? ANTLR, ANother Tool for Language Recognition, 是一个可以接受含有语法描述的语言描述 ...

  3. python模块之sqlite3

    在Python中操作sqlite3 1)基本使用 import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() ...

  4. gitlab之配置文件.gitlab-ci.yml

    自动化部署給我们带来的好处 自动化部署的好处体现在几个方面 1.提高前端的开发效率和开发测试之间的协调效率 Before 如果按照传统的流程,在项目上线前的测试阶段,前端同学修复bug之后,要手动把代 ...

  5. Git之常用文件

    git项目中的特殊文件, 常见文件有.gitignore, .gitkeep 1) .gitkeep git默认是不允许提交一个空的目录到版本库上的, 可以在空的文件夹里面建立一个.gitkeep文件 ...

  6. 记一次cenos7安装nginx

    安装依赖 yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 下 ...

  7. 了解URLSearchParams对象

    URLSearchParams对象用于处理URL中查询字符串,即?之后的部分. 1.语法 其实例对象的用法和Set数据结构类似.实例对象本身是可遍历对象.但是不是遍历器. var paramsStri ...

  8. Typroa主题替换

    Typroa主题替换 从这里下载主题 1.解压后: 2.拷贝到typroa的主题目录下(打开typroa -> 偏好设置 -> 外观 -> 打开主题文件夹) 3.拷贝后: 4.重新打 ...

  9. maven 太垃圾

    Java mon amour: Maven sucks like hell http://www.javamonamour.org/2010/08/maven-tricks.html 搜 why ma ...

  10. django介绍及基本使用

    目录 一.python主流web框架 二.django简介 1.版本问题 2.运行django注意事项 三.django基本使用 1.下载模块 2.验证 3.常见命令 4.pycharm自动创建dja ...