前言

明天逛github时,发现了这款对 SQL 进行优化和改写的自动化工具sora。感觉挺不错的,就下载学习了一下。这个工具反对的性能比拟多,能够作为咱们日常开发中的一款辅助工具,当初我就把它举荐给你们~~~

github传送门:https://github.com/XiaoMi/soar

背景

在咱们日常开发中,优化SQL总是咱们日常开发工作之一。例行 SQL 优化,不仅能够晋升程序性能,还可能升高线上故障的概率。

目前罕用的 SQL 优化形式包含但不限于:业务层优化、SQL逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目标。索引优化往往能够在短时间内产生十分微小的成果。如果可能将索引优化转化成工具化、标准化的流程,缩小人工染指的工作量,无疑会大大提高咱们的工作效率。

SOAR(SQL Optimizer And Rewriter) 是一个对 SQL 进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与保护。

与业内其余优良产品比照如下:

SOARsqlcheckpt-query-advisorSQL AdvisorInceptionsqlautoreview
启发式倡议✔️✔️✔️✔️✔️
索引倡议✔️✔️✔️
查问重写✔️
执行打算展现✔️
Profiling✔️
Trace✔️
SQL在线执行✔️
数据备份✔️

从上图能够看出,反对的功能丰富,其性能特点如下:

  • 跨平台反对(反对 Linux, Mac 环境,Windows 环境实践上也反对,不过未全面测试)
  • 目前只反对 MySQL 语法族协定的 SQL 优化
  • 反对基于启发式算法的语句优化
  • 反对简单查问的多列索引优化(UPDATE, INSERT, DELETE, SELECT)
  • 反对 EXPLAIN 信息丰盛解读
  • 反对 SQL 指纹、压缩和丑化
  • 反对同一张表多条 ALTER 申请合并
  • 反对自定义规定的 SQL 改写

就介绍这么多吧,既然是SQL优化工具,光说是没有用的,咱们还是先用起来看看成果吧。

装置

这里有两种装置形式,如下:

    1. 下载二进制安装包
$ 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. 源码装置

依赖环境:

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个品位(二)