前言
明天逛github
时,发现了这款对 SQL 进行优化和改写的自动化工具sora
。感觉挺不错的,就下载学习了一下。这个工具反对的性能比拟多,能够作为咱们日常开发中的一款辅助工具,当初我就把它举荐给你们~~~github传送门:https://github.com/XiaoMi/soar
背景
在咱们日常开发中,优化SQL总是咱们日常开发工作之一。例行 SQL 优化,不仅能够晋升程序性能,还可能升高线上故障的概率。
目前罕用的 SQL 优化形式包含但不限于:业务层优化、SQL逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目标。索引优化往往能够在短时间内产生十分微小的成果。如果可能将索引优化转化成工具化、标准化的流程,缩小人工染指的工作量,无疑会大大提高咱们的工作效率。
SOAR(SQL Optimizer And Rewriter) 是一个对 SQL 进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与保护。
与业内其余优良产品比照如下:
SOAR | sqlcheck | pt-query-advisor | SQL Advisor | Inception | sqlautoreview | |
---|---|---|---|---|---|---|
启发式倡议 | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
索引倡议 | ✔️ | ❌ | ❌ | ✔️ | ❌ | ✔️ |
查问重写 | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
执行打算展现 | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
Profiling | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
Trace | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
SQL在线执行 | ❌ | ❌ | ❌ | ❌ | ✔️ | ❌ |
数据备份 | ❌ | ❌ | ❌ | ❌ | ✔️ | ❌ |
从上图能够看出,反对的功能丰富,其性能特点如下:
- 跨平台反对(反对 Linux, Mac 环境,Windows 环境实践上也反对,不过未全面测试)
- 目前只反对 MySQL 语法族协定的 SQL 优化
- 反对基于启发式算法的语句优化
- 反对简单查问的多列索引优化(UPDATE, INSERT, DELETE, SELECT)
- 反对 EXPLAIN 信息丰盛解读
- 反对 SQL 指纹、压缩和丑化
- 反对同一张表多条 ALTER 申请合并
- 反对自定义规定的 SQL 改写
就介绍这么多吧,既然是SQL优化工具,光说是没有用的,咱们还是先用起来看看成果吧。
装置
这里有两种装置形式,如下:
- 下载二进制安装包
$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64 -O soarchmod a+x soar
这里倡议间接下载最新版,要不会有bug
。
下载好的二进制文件增加到环境变量中即可(不会的谷歌一下吧,这里就不讲了)。
测试一下:
$ echo 'select * from user' | soar.darwin-amd64(依据你本人的二进制文件名来输出)# Query: AC4262B5AF150CB5★ ★ ★ ☆ ☆ 75分```sqlSELECT *FROM USER```## 最外层 SELECT 未指定 WHERE 条件* **Item:** CLA.001* **Severity:** L4* **Content:** SELECT 语句没有 WHERE 子句,可能查看比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的申请如果不要求精度,倡议应用 SHOW TABLE STATUS 或 EXPLAIN 代替。## 不倡议应用 SELECT * 类型查问* **Item:** COL.001* **Severity:** L1* **Content:** 当表构造变更时,应用 \* 通配符抉择所有列将导致查问的含意和行为会产生更改,可能导致查问返回更多的数据。
- 源码装置
依赖环境:
1. Go 1.10+2. git
高级依赖(仅面向开发人员)
- mysql 客户端版本须要与容器中MySQL版本雷同,避免出现因为认证起因导致无奈连贯问题
- docker MySQL Server测试容器治理
- govendor Go包治理
- retool 依赖内部代码品质动态查看工具二进制文件治理
生成二进制文件:
go get -d github.com/XiaoMi/soarcd ${GOPATH}/src/github.com/XiaoMi/soar && make
生成的二进制文件与下面一样,间接放入环境变量即可,这里我没有尝试,靠你们本人踩坑了呦~~~
简略应用
0. 前置筹备
筹备一个table
,如下:
CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL DEFAULT '', `nickname` varchar(255) DEFAULT '', `password` varchar(256) NOT NULL DEFAULT '', `salt` varchar(48) NOT NULL DEFAULT '', `avatar` varchar(128) DEFAULT NULL, `uptime` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4
1. 间接输出sql语句(不运行)
$ echo "select * from users" | soar.darwin-amd64$ # Query: 30AFCB1E1344BEBD★ ★ ★ ☆ ☆ 75分```sqlSELECT *FROM users```## 最外层 SELECT 未指定 WHERE 条件* **Item:** CLA.001* **Severity:** L4* **Content:** SELECT 语句没有 WHERE 子句,可能查看比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的申请如果不要求精度,倡议应用 SHOW TABLE STATUS 或 EXPLAIN 代替。## 不倡议应用 SELECT * 类型查问* **Item:** COL.001* **Severity:** L1* **Content:** 当表构造变更时,应用 \* 通配符抉择所有列将导致查问的含意和行为会产生更改,可能导致查问返回更多的数据。
当初是齐全依据SQL语句进行剖析的,因为没有连贯到mysql
。能够看到,给出的报告也很具体,然而只是空壳子,仅凭SQL
语句给出的剖析并不是精确的,所以咱们开始接下来的利用。
2. 连贯mysql
生成EXPLAIN
剖析报告
咱们能够在配置文件中配置好mysql
相干的配置,操作如下:
vi soar.yaml# yaml format config fileonline-dsn: addr: 127.0.0.1:3306 schema: asong user: root password: root1997 disable: falsetest-dsn: addr: 127.0.0.1:3306 schema: asong user: root password: root1997 disable: false
配置好了,咱们来实际一下子吧:
$ echo "SELECT id,username,nickname,password,salt,avatar,uptime FROM users WHERE username = 'asong1111'" | soar.darwin-amd64 -test-dsn="root:root1997@127.0.0.1:3306/asong" -allow-online-as-test -log-output=soar.log$ # Query: D12A420193AD1674★ ★ ★ ★ ★ 100分```sqlSELECT id, username, nickname, PASSWORD, salt, avatar, uptimeFROM usersWHERE username = 'asong1111'```## Explain信息| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra ||---|---|---|---|---|---|---|---|---|---|---|---|---|| 1 | SIMPLE | *users* | NULL | const | username | username | 258 | const | 1 | ☠️ **100.00%** | ☠️ **O(n)** | NULL |### Explain信息解读#### SelectType信息解读* **SIMPLE**: 简略SELECT(不应用UNION或子查问等).#### Type信息解读* **const**: const用于应用常数值比拟PRIMARY KEY时, 当查问的表仅有一行时, 应用system. 例:SELECT * FROM tbl WHERE col = 1.
这回后果中多了EXPLAIN信息剖析报告。这对于刚开始入门的小伙伴们是敌对的,因为咱们对Explain
解析的字段并不相熟,有了它咱们能够完满的剖析SQL
中的问题,是不是很棒。
3. 语法查看
soar
工具不仅仅能够进行sql
语句剖析,还能够进行对sql
语法进行查看,找出其中的问题,来看个例子:
$ echo "selec * from users" | soar.darwin-amd64 -only-syntax-checkAt SQL 1 : line 1 column 5 near "selec * from users" (total length 18)
这里select
关键字少了一个t
,运行该指令帮忙咱们一下就定位了问题,当咱们的sql
语句很长时,就能够应用该指令来辅助咱们查看SQL
语句是否正确。
4. SQL丑化
咱们日常开发时,常常会看其他人写的代码,因为程度不一样,所以有些SQL
语句会写的很乱,所以这个工具就派上用场了,咱们能够把咱们的SQL
语句变得丑陋一些,更容易咱们了解哦。
$ echo "SELECT id,username,nickname,password,salt,avatar,uptime FROM users WHERE username = 'asong1111'" | soar.darwin-amd64 -report-type=prettySELECT id, username, nickname, PASSWORD, salt, avatar, uptimeFROM usersWHERE username = 'asong1111';
这样看起来是不是更直观了呢~~。
结尾
因为我也才是刚应用这个工具,更多的玩法我还没有发现,当前补充。更多玩法能够本人钻研一下,github传送门:https://github.com/XiaoMi/soar。官网文档其实很毛糙,更多办法解锁还要靠本人钻研,毕竟源码曾经给咱们了,对于学习go
也有肯定帮忙,当作一个小我的项目缓缓优化岂不是更好呢~~。
好啦,这一篇文章到这就完结了,咱们下期见~~。心愿对你们有用,又不对的中央欢送指出,可增加我的golang交换群,咱们一起学习交换。
结尾给大家发一个小福利吧,最近我在看[微服务架构设计模式]这一本书,讲的很好,本人也收集了一本PDF,有须要的小伙能够到自行下载。获取形式:关注公众号:[Golang梦工厂],后盾回复:[微服务],即可获取。
我翻译了一份GIN中文文档,会定期进行保护,有须要的小伙伴后盾回复[gin]即可下载。
翻译了一份Machinery中文文档,会定期进行保护,有须要的小伙伴们后盾回复[machinery]即可获取。
我是asong,一名普普通通的程序猿,让gi我一起缓缓变强吧。我本人建了一个golang
交换群,有须要的小伙伴加我vx
,我拉你入群。欢送各位的关注,咱们下期见~~~
举荐往期文章:
- machinery-go异步工作队列
- 十张动图带你搞懂排序算法(附go实现代码)
- Go语言相干书籍举荐(从入门到放弃)
- go参数传递类型
- 手把手教姐姐写音讯队列
- 常见面试题之缓存雪崩、缓存穿透、缓存击穿
- 详解Context包,看这一篇就够了!!!
- go-ElasticSearch入门看这一篇就够了(一)
- 面试官:go中for-range应用过吗?这几个问题你能解释一下起因吗
- 学会wire依赖注入、cron定时工作其实就这么简略!
- 据说你还不会jwt和swagger-饭我都不吃了带着实际我的项目我就来了
- 把握这些Go语言个性,你的程度将进步N个品位(二)