SOAR(SQLOptimizerAndRewriter)是一个对SQL进行优化和改写的自动化工具。由小米人工智能与云平台的数据库团队开发与维护。今天主要介绍下怎么用SOAR来做一些sql优化的工作。。一、功能特点跨平台支持(支持Linux,Mac环...
SOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与维护。
今天主要介绍下怎么用SOAR来做一些sql优化的工作。。
跨平台支持(支持Linux, Mac环境,Windows环境理论上也支持,不过未全面测试)
目前只支持 MySQL 语法族协议的SQL优化
支持基于启发式算法的语句优化
支持复杂查询的多列索引优化(UPDATE, INSERT, DELETE, SELECT)
支持EXPLAIN信息丰富解读
支持SQL指纹、压缩和美化
支持同一张表多条ALTER请求合并
支持自定义规则的SQL改写
SOAR主要由语法解析器,集成环境,优化建议,重写逻辑,工具集五大模块组成。
一条SQL从文件,标准输入或命令行参数等形式传递给SOAR后首先进入语法解析器,这里一开始我们选用了vitess的语法解析库作为SOAR的语法解析库,但随时需求的不断增加我们发现有些复杂需求使用vitess的语法解析实现起来比较逻辑比较复杂。于是参考业务其他数据库产品,我们引入了TiDB的语法解析器做为补充。我们发现这两个解析库还存在一定的盲区,于是又引入了MySQL执行返回结果作为多版本SQL方言的补充。大家也可以看到在语法解析器这里,SOAR的实现方案是松散的、可插拔的。SOAR并不直接维护庞大的语法解析库,它把各种优秀的语法解析库集成在一起,各取所长。
2、集成环境
集成环境区分线上环境和测试环境两种,分别用于解决不同场景下用户的SQL优化需求。一种常见的情况是已有表结构需要优化查询SQL的场景,可以从线上环境导出表结构和足够的采样数据到测试环境,在测试环境上就可以放心的执行各种高危操作而不用担心数据被损坏。另一种常见的情况是建一套全新的数据库,需要验证提供的数据字典中是否存在优化的可能。对于这种情况,很有可能你不需要知道线上环境在哪儿,完全只是想先试试看,如果报错了马上改对就是了。
3、优化建议
目前SOAR可以提供的优化建议有基于启发式规则(通常也称之为经验)的优化建议,基于索引优化算法给出的索引优化建议,以及基于EXPLAIN信息给出的解读。
4、重写逻辑
为了进一步简化SQL优化的成本,SOAR又进一步挖掘了自动SQL重写的功能。提供几十种常见场景下的SQL等价转写,不过相比SQL优化建议还有很大的改进空间。
5、工具集
除了SQL优化和改写以外,为了方便用户使用以及美化输出展现形式,SOAR还提供了一些辅助的小工具,比如markdown转HTML工具,SQL格式化输出工具等等。
1、二进制部署
wget https://github.com/XiaoMi/soar/releases/download/0.9.0/soar.linux-amd64 -O soar chmod a+x soar
2、用法
2.1、基本用法
echo "select title from sakila.film" | ./soar -log-output=soar.log
2.2、指定输入源
# 从文件读取SQL./soar -query file.sql
2.3、 从管道读取SQL
cat file.sql | ./soar
2.4、指定配置文件
vi soar.yaml # yaml format config fileonline-dsn: addr: 127.0.0.1:3306 schema: sakila user: root password: "1t'sB1g3rt" disable: falsetest-dsn: addr: 127.0.0.1:3306 schema: sakila user: root password: "1t'sB1g3rt" disable: falseecho "select title from sakila.film" | ./soar -test-dsn="root:1t'sB1g3rt@127.0.0.1:3306/sakila" -allow-online-as-test -log-output=soar.log
3、实例
# cat query.sql select * from fsl_order_base_line where order_base in (select id from (SELECT t2.shipper,t2.dest_dock_code,t1.order_no2,t1.supplier,COUNT(0) cnt,max(t1.id) id FROM fsl_order_base t1 JOIN fsl_order_base_line t2 ON t1.id = t2.order_base WHERE t1.project_code = 'DD' and order_status=0 GROUP BY t2.shipper , t2.dest_dock_code , t1.order_no2 , t1.supplier HAVING COUNT(0) >= 2) a) # cat soar.yaml # yaml format config fileonline-dsn: addr: 127.0.0.1:3306 schema: xx user: root password: "password" disable: false--优化./soar -query query.sql -online-dsn="root:password@127.0.0.1:3306/xxx" -allow-online-as-test -log-output=soar.log
全文详见:http://xpxw.com/?id=152