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

1、功能特点

跨平台支持(支持 Linux, Mac 环境,Windows 环境理论上也支持,不过未全面测试)
目前只支持 MySQL 语法族协议的 SQL 优化
支持基于启发式算法的语句优化
支持复杂查询的多列索引优化(UPDATE, INSERT, DELETE, SELECT)
支持 EXPLAIN 信息丰富解读
支持 SQL 指纹、压缩和美化
支持同一张表多条 ALTER 请求合并
支持自定义规则的 SQL 改写

2、业内其他优秀产品对比

SOAR sqlcheck pt-query-advisor SQL Advisor Inception sqlautoreview
启发式建议 ✔️ ✔️ ✔️ ✔️ ✔️
索引建议 ✔️ ✔️ ✔️
查询重写 ✔️
执行计划展示 ✔️
Profiling ✔️
Trace ✔️
SQL在线执行 ✔️
数据备份 ✔️

3、安装与使用

3.1 下载soar

https://github.com/XiaoMi/soar/blob/master/doc/install.md

下载soar二进制安装包:

wget https://github.com/XiaoMi/soar/releases/download/${tag}/soar.${OS}-amd64 -O soar
chmod a+x soar如`0.11.0`版本的下载方式:
wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64 -O soar
# 添加可执行权限
chmod +x soar

如果下载慢,可以通过浏览器访问https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64直接下载后,再拷贝过去

3.2 安装扩展库

soar-php 是一个基于小米公司开源的 soar 开发的 PHP 扩展包,方便框架中 SQL 语句调优。

composer require guanguans/soar-php --dev

3.3 配置

更多详细配置请参考 soar config

方法一、运行时初始化配置

<?phprequire_once __DIR__.'/vendor/autoload.php';use Guanguans\SoarPHP\Soar;$config = [// 下载的 soar 的路径'-soar-path' => '/Users/yaozm/Documents/wwwroot/soar-php/soar.darwin-amd64',// 测试环境配置'-test-dsn' => ['host' => '127.0.0.1','port' => '3306','dbname' => 'database','username' => 'root','password' => '123456',],// 日志输出文件'-log-output' => './soar.log',// 报告输出格式: 默认  markdown [markdown, html, json]'-report-type' => 'html',
];
$soar = new Soar($config);

方法二、配置文件初始化配置

vendor 同级目录下新建 .soar.dist 或者 .soar,内容参考 .soar.example,例如:

<?php
return [// 下载的 soar 的路径'-soar-path' => '/Users/yaozm/Documents/wwwroot/soar-php/soar.darwin-amd64',// 测试环境配置'-test-dsn' => ['host' => '127.0.0.1','port' => '3306','dbname' => 'database','username' => 'root','password' => '123456',],// 日志输出文件'-log-output' => './soar.log',// 报告输出格式: 默认  markdown [markdown, html, json]'-report-type' => 'html',
];

运行时初始化配置 > .soar > .soar.dist

然后初始化:

<?phprequire_once __DIR__.'/vendor/autoload.php';
use Guanguans\SoarPHP\Soar;
$soar = new Soar();

3.4 测试

3.4.1 SQL 评分

方法调用:

$sql ="SELECT * FROM `fa_user` `user` LEFT JOIN `fa_user_group` `group` ON `user`.`group_id`=`group`.`id`;";
echo $soar->score($sql);

输出结果:

3.4.2 explain 信息解读

方法调用:

$sql = "SELECT * FROM `fa_auth_group_access` `aga` LEFT JOIN `fa_auth_group` `ag` ON `aga`.`group_id`=`ag`.`id`;";
// 输出 html 格式
echo $soar->htmlExplain($sql);
// 输出 md 格式
echo $soar->mdExplain($sql);
// 输出 html 格式
echo $soar->explain($sql, 'html');
// 输出 md 格式
echo $soar->explain($sql, 'md');

更多参考:https://github.com/guanguans/soar-php

3.4.3 thinkphp 6 框架

可以考虑封装成 function,这样直接调用函数就行

use think\facade\Db;
use Guanguans\SoarPHP\Soar;if (!function_exists('soar')) {function soar(){//soar.php 为配置文件return \think\Facade::make(Soar::class, [config('soar')]);}
}/*** SQL 评分*/
if (!function_exists('soar_score')) {function soar_score($sql = null){return null === $sql ? soar()->score(str_replace('`', '', Db::getLastSql())) :soar()->score(str_replace('`', '', $sql));}
}/*** explain 信息解读*/
if (!function_exists('soar_md_explain')) {function soar_md_explain($sql = null){return null === $sql ? soar()->mdExplain(str_replace('`', '', Db::getLastSql())) :soar()->mdExplain(str_replace('`', '', $sql));}
}/*** explain 信息解读*/
if (!function_exists('soar_html_explain')) {function soar_html_explain($sql = null){return null === $sql ? soar()->htmlExplain(str_replace('`', '', Db::getLastSql())) :soar()->htmlExplain(str_replace('`', '', $sql));}
}/*** 语法检查*/
if (!function_exists('soar_syntax_check')) {function soar_syntax_check($sql = null){return null === $sql ? soar()->syntaxCheck(str_replace('`', '', Db::getLastSql())) :soar()->syntaxCheck(str_replace('`', '', $sql));}
}/*** SQL 指纹*/
if (!function_exists('soar_finger_print')) {function soar_finger_print($sql = null){return null === $sql ? soar()->fingerPrint(str_replace('`', '', Db::getLastSql())) :soar()->fingerPrint(str_replace('`', '', $sql));}
}/*** SQL 美化*/
if (!function_exists('soar_pretty')) {function soar_pretty($sql = null){return null === $sql ? soar()->pretty(str_replace('`', '', Db::getLastSql())) :soar()->pretty(str_replace('`', '', $sql));}
}/*** markdown 转化为 html*/
if (!function_exists('soar_md2html')) {function soar_md2html($markdown){return  soar()->md2html($markdown);}
}/*** soar 帮助*/
if (!function_exists('soar_exec')) {function soar_exec($command){return soar()->exec($command);}
}/*** 执行任意 soar 命令*/
if (!function_exists('soar_help')) {function soar_help(){return soar()->help();}
}

soar-php SQL语句优化与重写的自动化工具相关推荐

  1. SOAR SQL进行优化和改写的自动化工具

    前言 SQL优化是程序开发中经常遇到的问题,尤其是在程序规模不断扩大的时候.SQL的好坏不仅制约着程序的规模,影响着用户的体验,甚至威胁着信息的安全. 我们经常听到说哪家平台挂了,哪家网站被黑了,但我 ...

  2. mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条

    高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...

  3. mysql sql优化入门_Mysql入门SQL 语句优化方法30例

    作者:VEPHP   时间 2017-09-27 <Mysql入门SQL 语句优化方法30例>要点: 本文介绍了Mysql入门SQL 语句优化方法30例,希望对您有用.如果有疑问,可以联系 ...

  4. 【转】sql语句优化工具LECCO SQL Expert

    软件说明: 更优更快 人工智能自动SQL优化----------http://www.sina.com.cn 2001/12/12 17:48 中国电脑教育报文/SQL爱好者 所谓SQL,就是指Str ...

  5. MySQL数据库:SQL语句优化

    数据库最常用的优化方式有:SQL语句和索引.数据库表结构.系统配置.硬件. 优化效果:SQL语句和索引 < 数据库表结构 < 系统配置 < 硬件,成本也是递增的. 优化方法 设计符合 ...

  6. SQL 语句优化原则:

    SQL 语句优化原则: 1. IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从执行的步骤来分析用IN的SQL与不用 ...

  7. 【大话Mysql面试】-SQL语句优化

    五.SQL优化 5.1 如何定义以及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计 ...

  8. SQL语句优化之降龙十八掌

    sql 语句优化 一前言  客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连.超时,严重影响业 ...

  9. 基于索引的SQL语句优化之降龙十八掌

    一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言       客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能 ...

最新文章

  1. python中 doc_python中doc转pdf
  2. 页面之间url传值,传循环数据里的值成功传值成功接收(动态数据传值)
  3. MySQL5.6 Performance_schema
  4. What happens when clicking interaction recor工作中心
  5. java序列化表单同步请求_Ajax serialize() 表单进行序列化方式上传文件
  6. php target标签,为Typecho文章页url标签添加nofollow和target属性
  7. vue-router路由懒加载(解决vue项目首次加载慢)
  8. Eclipse快捷键_10个最高效的快捷键
  9. Java本质论之关于Java栈与堆的思考
  10. IEEE745浮点数格式
  11. H3C WAC360 基于Win2012 NPS 802.1x 认证
  12. ADF单位根检验三种形式_【EViews】面板数据的处理方法及检验步骤
  13. 【HCIE安全】双机热备-主备备份
  14. MySQL多个关键词检索字段
  15. ROS生成弓字形覆盖路径点逻辑分析
  16. 微信摇一摇效果HTML,JavaScript+H5实现微信摇一摇功能
  17. ye我们胜利了的shooow
  18. Inkcanvas 放大缩小变换
  19. 推荐算法最前沿|CIKM2020推荐系统论文一览
  20. linux命令行怎么结束进程,linux结束进程命令

热门文章

  1. 内网下YUM仓库搭建配置+服务器yum源配置
  2. 关于麦克纳姆轮的速度分解,以及多方向控制
  3. 汉诺塔问题思路的证明
  4. 一、可靠性基础知识【注册可靠性工程师实战笔记】
  5. mysql的ssl连接失败_MySQL数据库的SSL连接失败
  6. 2022山东视力防控展,护眼健康产品展,护眼仪展,哺光仪展
  7. 湖南省职业院校技能大赛高职组Web应用软件开发赛
  8. hdu 4539 郑厂长系列故事——排兵布阵
  9. Vue强制刷新Dom
  10. 农场有头大母牛,每年生头小母牛,小母牛五年后生小母牛,问20年后农场一共有多少头牛?(用面向对象的思想)