关于golang:推荐mysql优化神器

9次阅读

共计 5004 个字符,预计需要花费 13 分钟才能阅读完成。

前言

明天逛 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 优化工具,光说是没有用的,咱们还是先用起来看看成果吧。

装置

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

    1. 下载二进制安装包
$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64 -O soar
chmod a+x soar

这里倡议间接下载最新版,要不会有bug

下载好的二进制文件增加到环境变量中即可(不会的谷歌一下吧,这里就不讲了)。

测试一下:

$ echo 'select * from user' | soar.darwin-amd64(依据你本人的二进制文件名来输出)
# Query: AC4262B5AF150CB5

★ ★ ★ ☆ ☆ 75 分

​```sql

SELECT
  *
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/soar
cd ${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 分

​```sql

SELECT
  *
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 file
online-dsn:
    addr:     127.0.0.1:3306
    schema:   asong
    user:     root
    password: root1997
    disable:  false

test-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 分

​```sql

SELECT
  id, username, nickname, PASSWORD, salt, avatar, uptime
FROM
  users
WHERE
  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-check
At 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=pretty

SELECT
  id, username, nickname, PASSWORD, salt, avatar, uptime
FROM
  users
WHERE
  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 个品位(二)
正文完
 0