本文介绍了soar能够提供的功能以及一些使用场景,并给出相关用例。
上篇文章回顾: dpdk-lvs的一次线上故障排查报告
soar开源两周以来,在Github得到了社区2700+颗星的支持,这期间有不少的开源社区同窗参与到soar的成长当中,为咱们提供了许多优秀的意见和建议。javascript
咱们但愿可以有更多的人来感觉一下这款“SQL优化神器”可以带给你的方便和快捷,这篇文章将会对soar能够提供的功能以及一些使用场景作出介绍,并给出相关用例。css
echo "select title from sakila.film" | ./soar -log-output=soar.log复制代码
soar能够经过管道的方式接受传入的SQL,也能够经过-query的方式来传入SQL或指定输入源。使用方式示例以下:html
# 从文件读取SQL
./soar -query file.sql
# 从管道读取SQL
cat file.sql | ./soar复制代码
在平常使用的时候,若是您是为了快速得到简单SQL的评审结果,能够用命令行方式进行传入。但咱们建议使用文件的方式进行传入,来避免可能存在的转义问题。java
在以前的系列文章中咱们提到了配置文件的重要性,配置的正确性决定了soar的服务质量。用户能够经过如下案例的方式来编辑soar的配置文件。在不指定配置文件的状况下,soar默认会从依次检查/etc/soar.yaml,./etc/soar.yaml以及./soar.yaml这三个路径,配置文件优先级依次递减。mysql
vi soar.yaml
# yaml format config file
online-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: false复制代码
若是您须要临时指定某些变量,能够用命令行参数的形式来指定须要的变量。命令行模式下的配置设置优先级最高。sql
echo "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复制代码
但经过命令行的方式输入配置可能会存在转义的问题,您也可使用-config的方式来指定您须要的配置文件。数据库
echo "select title from sakila.film" | ./soar -config=mysoar.yaml -allow-online-as-test -log-output=soar.log复制代码
您能够经过-list-heuristic-rules的方式来查看目前soar支持的所有启发式规则建议,默认输出的是markdown格式的文档,您能够重定向到一个文件中进行查看,soar提供的启发式建议的相关文档就是经过这一方式生成的。json
$ soar -list-heuristic-rules复制代码
soar中是能够经过配置-ignore-rules的方式来忽略某些建议的输出。能够用正则的方式来进行全局匹配,也能够指定某个特定的规则item来进行精准屏蔽,多条规则之间用逗号分离。安全
$ soar -ignore-rules "ALI.001,IDX.*"复制代码
soar支持多种输出方式,默认状况下为markdown格式的输出,您能够根据须要设置您的输出方式,好比json,好比html等。bash
$ soar -report-type json复制代码
-reprot-type除了能够调整输出格式,某些特定的功能也是以-report-type的方式来提供的。好比SQL重写,好比fingerprint等。与查看启发式规则同样,想要查看soar支持的所有-report-type,能够经过-list-report-types的方式来查看支持的所有使用方式。
$ soar -list-report-types复制代码
虽然soar的功能很是丰富,可是在某些特定状况下,好比写了一条SQL却并不能确定语法是不是正确的,那么能够经过soar提供的语法检查工具来对SQL语法进行检查,此时只会检查语法的正确性而不会进行一步的评审。
$ echo "select * from tb" | soar -only-syntax-check
$ echo $?0$ echo "select * fromtb" | soar -only-syntax-check
At SQL 0 : syntax error at position 16 near 'fromtb'$ echo $?
1复制代码
soar提供了必定的基于抽象语法树实现的SQL重写能力。虽然如今这一个功能尚处于研发测试阶段,可是某些小的功能已经相对比较完善了,如下举例几个简单地重写使用场景。
在某些状况下,咱们须要对非查询语句进行性能分析,为了保证安全,咱们能够先经过soar将这些语句转化成等价的select语句,在对这些查询语句进行进一步分析。
$ echo "update film set title = 'abc'" | soar -rewrite-rules dml2select,delimiter -report-type rewrite复制代码
输出
select * from film;复制代码
当线上数据库环境须要须要进行更新操做时,为了让某些在线改表工具正确的执行,咱们应该将同一张表的多条alter语句合并为一条。soar提供了这样的功能来方便研发人员或DBA进行合并。
$ echo "alter table tb add column a int; alter table tb add column b int;" | soar -report-type rewrite -rewrite-rules mergealter复制代码
输出
ALTER TABLE `tb` add column a int, add column b int ;复制代码
有时咱们获取到了EXPLAIN信息,但可能对于MySQL EXPLAIN的内容不熟悉。您能够将mysql输出的EXPLAIN信息交给soar,来帮助辅助解读其中的信息。这里传入的explain能够是普通的表格,也能够是MySQL的JSON格式EXPLAIN。
$ soar -report-type explain-digest << EOF
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | film | ALL | NULL | NULL | NULL | NULL | 1131 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
EOF复制代码
默认输出结果为markdown格式。
## Explain信息
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | *film* | NULL | ALL | NULL | NULL | NULL | NULL | 0 | 0.00% | ☠️ **O(n)** | |
### Explain信息解读
#### SelectType信息解读
* **SIMPLE**: 简单SELECT(不使用UNION或子查询等).
#### Type信息解读
* ☠️ **ALL**: 最坏的状况, 从头至尾全表扫描.复制代码
若是您没有适合的markdown工具,soar也自带了markdown转html这样的功能,尽量的让全部人都能感觉到soar原生报告的优雅。你还能够经过指定-report-css, -report-javascript, -markdown-extensions, -markdown-html-flags这些参数控制HTML的显示格式。
$ cat test.md | soar -report-type md2html > test.html复制代码
如配置了-drop-test-temporary=false或soar异常停止,-test-dsn中会残余以optimizer_为前缀的临时库表。手工清理这些库表可使用以下命令。
注意:为了避免影响正在进行的其余SQL评审,-cleanup-test-database中会删除1小时前生成的临时库表。
./soar -cleanup-test-database复制代码
本文首发于公众号“小米运维”,点击查看原文