【SQL】sqladvisor

news2024/12/23 6:12:10

文章目录

    • 概述
    • 架构流程
    • 产品特点
    • 安装部署
    • 使用
      • 帮助输出
      • 命令行传参调用
      • 配置文件传参调用
      • 测试一:对小表进行测试
      • 测试二:对大表有索引测试
      • 测试三:对大表无索引进行测试
      • 测试四:多条SQL同时分析:
    • 来源

概述

SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的SQL优化工具。它基于MySQL原生态词法解析,结合分析SQL中的where条件、聚合条件、多表Join关系 给出索引优化建议。

主要功能:输出SQL索引优化建议

美团开源出来的SQLAdvisor SQL优化建议工具只有命令行,所以有网友就针对这个开发出了Web版本,告别命令行。

GitHub地址:https://github.com/zyw/sqladvisor-web

项目中使用的美团SQL分析工具是在CentOS上编译的,所以建议部署到CentOS上。
该项目是使用Python的Flask框架开发的。
使用CentOS自带的Python版本,版本号是2.7.5。

架构流程

在这里插入图片描述

产品特点

  • 基于 MySQL 原生词法解析,充分保证词法解析的性能、准确定以及稳定性;
  • 支持常见的 SQL (Insert/Delete/Update/Select);
  • 支持多表 Join 并自动逻辑选定驱动表;
  • 支持聚合条件 Order by 和 Group by;
  • 过滤表中已存在的索引。

安装部署

[admin@git-server opt]# pwd
/opt
[admin@git-server opt]#  yum install git
[admin@git-server opt]# git clone https://github.com/Meituan-Dianping/SQLAdvisor.git
[admin@git-server opt]# yum install cmake libaio-devel libffi-devel glib2 glib2-devel
[admin@git-server opt]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
[admin@git-server opt]# yum install Percona-Server-shared-56
[admin@git-server opt]# cd /usr/lib64/
[admin@git-server opt]# ln -s libperconaserverclient_r.so.18 libperconaserverclient_r.so

[admin@git-server opt]# cmake -DBUILD_CONFIG=mysql_release -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr/local/sqlparser ./
[admin@git-server opt]# make && make install
[admin@git-server opt]# cd SQLAdvisor/sqladvisor
[admin@git-server sqladvisor]# cmake -DCMAKE_BUILD_TYPE=debug ./
[admin@git-server sqladvisor]# make

在本路径下生成一个sqladvisor可执行文件,这即是我们想要的。

命令参数如下:

[admin@git-server sqladvisor]# ./sqladvisor --help
Usage:
  sqladvisor [OPTION...] sqladvisor

SQL Advisor Summary

Help Options:
  -?, --help              Show help options

Application Options:
  -f, --defaults-file     sqls file
  -u, --username          username
  -p, --password          password
  -P, --port              port
  -h, --host              host
  -d, --dbname            database name
  -q, --sqls              sqls
  -v, --verbose           1:output logs 0:output nothing

使用

帮助输出

$ sqladvisor -- help
Usage:
sqladvisor [OPTION . . . ] sqladvisor
SQL Advisor Summary
Help Options:
- ? , -- help               Show help options
Application Options:
-f , --defaults- file     sqls file
-u , -- username          username
-p , -- password          password
-P , -- port              port
-h , -- host              host
-d , -- dbname             database name
-q , -- sqls              sqls
-v , -- verbose           1: output logs 0: output nothing

命令行传参调用

$ sqladvisor - h xx  - P xx  - u xx - p 'xx' - d xx - q "sql" - v 1

配置文件传参调用

$ cat sql .cnf
[sqladvisor ]
username= xx
password= xx
host= xx
port= xx
dbname= xx
sqls=sql1 ;sql2 ;sql3 . . . .
$ sqladvisor - f sql .cnf  - v 1

测试一:对小表进行测试

[admin@git-server sqladvisor]#  ./sqladvisor -h 127.0.0.1 -P 3306 -u admin -p "test@6666" -d zixun3 -q "select * from  zx_addonarticle;" -v 1
2018-06-14 17:57:33 1050 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `zixun3`.`zx_addonarticle` 

2018-06-14 17:57:33 1050 [Note] 第2步:表zx_addonarticle 的SQL太逆天,没有优化建议 

2018-06-14 17:57:33 1050 [Note] 第3步: SQLAdvisor结束! 

当然上面的命令也是可以写入配置文件,通过-f参数指定文件来操作的

[admin@git-server sqladvisor]# cat test01.cnf 
[sqladvisor]
username=admin
password=test@6666
host=127.0.0.1
port=3306
dbname=zixun3
sqls=select * from  zx_addonarticle;
[admin@git-server sqladvisor]# ./sqladvisor -f test01.cnf -v 1
2018-06-14 18:01:42 1198 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `zixun3`.`zx_addonarticle` 
2018-06-14 18:01:42 1198 [Note] 第2步:表zx_addonarticle 的SQL太逆天,没有优化建议 
2018-06-14 18:01:42 1198 [Note] 第3步: SQLAdvisor结束! 

测试二:对大表有索引测试

MySQL [zhangyou]> show index from test_table01;;
+--------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table        | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test_table01 |          0 | PRIMARY     |            1 | id          | A         |      120201 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          0 | day         |            1 | day         | A         |          10 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          0 | day         |            2 | planid      | A         |        1521 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          0 | day         |            3 | uid         | A         |      120201 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          0 | day         |            4 | siteid      | A         |      120201 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          0 | day         |            5 | zoneid      | A         |      120201 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          1 | idx_day_uid |            1 | day         | A         |         112 |     NULL | NULL   |      | BTREE      |         |               |
| test_table01 |          1 | idx_day_uid |            2 | uid         | A         |       10927 |     NULL | NULL   |      | BTREE      |         |               |
+--------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
11 rows in set (0.00 sec)
[admin@git-server sqladvisor]# vim test.cnf 
[sqladvisor]
username=admin
password=test@6666
host=127.0.0.1
port=3306
dbname=zhangyou
sqls=select * from test_table01 where day='2016-04-22' and uid=26';
[admin@git-server sqladvisor]# ./sqladvisor -f test.cnf -v 1
2018-06-14 18:08:24 1281 [Note] 第1步: 对SQL解析优化之后得到的SQL:select had some error 
2018-06-14 18:08:24 1281 [Note] 第2步:开始解析where中的条件:(`day` = '2016-04-22') 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 
2018-06-14 18:08:24 1281 [Note] show table status like 'test_table01' 
2018-06-14 18:08:24 1281 [Note] select count(*) from ( select `day` from `test_table01` FORCE INDEX( day ) order by day DESC,planid DESC,uid DESC,siteid DESC,zoneid DESC,adstypeid DESC limit 10000) `test_table01` where (`day` = '2016-04-22')  
2018-06-14 18:08:24 1281 [Note] 第3步:表test_table01的行数:120201,limit行数:10000,得到where条件中(`day` = '2016-04-22')的选择度:10000 
2018-06-14 18:08:24 1281 [Note] 第4步:开始解析where中的条件:(`uid` = 26) 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 
2018-06-14 18:08:24 1281 [Note] show table status like 'test_table01' 
2018-06-14 18:08:24 1281 [Note] select count(*) from ( select `uid` from `test_table01` FORCE INDEX( day ) order by day DESC,planid DESC,uid DESC,siteid DESC,zoneid DESC,adstypeid DESC limit 10000) `test_table01` where (`uid` = 26)  
2018-06-14 18:08:24 1281 [Note] 第5步:表test_table01的行数:120201,limit行数:10000,得到where条件中(`uid` = 26)的选择度:10000 
2018-06-14 18:08:24 1281 [Note] 第6步:开始验证 字段day是不是主键。表名:test_table01 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 where Key_name = 'PRIMARY' and Column_name ='day' and Seq_in_index = 1 
2018-06-14 18:08:24 1281 [Note] 第7步:字段day不是主键。表名:test_table01 
2018-06-14 18:08:24 1281 [Note] 第8步:开始验证 字段day是不是主键。表名:test_table01 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 where Key_name = 'PRIMARY' and Column_name ='day' and Seq_in_index = 1 
2018-06-14 18:08:24 1281 [Note] 第9步:字段day不是主键。表名:test_table01 
2018-06-14 18:08:24 1281 [Note] 第10步:开始验证表中是否已存在相关索引。表名:test_table01, 字段名:day, 在索引中的位置:1 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 where Column_name ='day' and Seq_in_index =1 
2018-06-14 18:08:24 1281 [Note] 第11步:开始验证 字段uid是不是主键。表名:test_table01 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 where Key_name = 'PRIMARY' and Column_name ='uid' and Seq_in_index = 1 
2018-06-14 18:08:24 1281 [Note] 第12步:字段uid不是主键。表名:test_table01 
2018-06-14 18:08:24 1281 [Note] 第13步:开始验证表中是否已存在相关索引。表名:test_table01, 字段名:uid, 在索引中的位置:2 
2018-06-14 18:08:24 1281 [Note] show index from test_table01 where Column_name ='uid' and Seq_in_index =2 
2018-06-14 18:08:24 1281 [Note] 第14步:索引(day,uid)已存在 
2018-06-14 18:08:24 1281 [Note] 第15步: SQLAdvisor结束! 

测试三:对大表无索引进行测试

[admin@git-server sqladvisor]# vim test.cnf 
[sqladvisor]
username=admin
password=test@6666
host=127.0.0.1
port=3306
dbname=zhangyou
sqls=select * from test_table01 where  zoneid=42 and views=198;
[admin@git-server sqladvisor]# ./sqladvisor -f test.cnf -v 1
2018-06-14 18:15:09 1348 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `zhangyou`.`test_table01` where ((`zoneid` = 42) and (`views` = 198)) 
2018-06-14 18:15:09 1348 [Note] 第2步:开始解析where中的条件:(`zoneid` = 42) 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 
2018-06-14 18:15:09 1348 [Note] show table status like 'test_table01' 
2018-06-14 18:15:09 1348 [Note] select count(*) from ( select `zoneid` from `test_table01` FORCE INDEX( day ) order by day DESC,planid DESC,uid DESC,siteid DESC,zoneid DESC,adstypeid DESC limit 10000) `test_table01` where (`zoneid` = 42)  
2018-06-14 18:15:09 1348 [Note] 第3步:表test_table01的行数:120201,limit行数:10000,得到where条件中(`zoneid` = 42)的选择度:10000 
2018-06-14 18:15:09 1348 [Note] 第4步:开始解析where中的条件:(`views` = 198) 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 
2018-06-14 18:15:09 1348 [Note] show table status like 'test_table01' 
2018-06-14 18:15:09 1348 [Note] select count(*) from ( select `views` from `test_table01` FORCE INDEX( day ) order by day DESC,planid DESC,uid DESC,siteid DESC,zoneid DESC,adstypeid DESC limit 10000) `test_table01` where (`views` = 198)  
2018-06-14 18:15:09 1348 [Note] 第5步:表test_table01的行数:120201,limit行数:10000,得到where条件中(`views` = 198)的选择度:2000 
2018-06-14 18:15:09 1348 [Note] 第6步:开始验证 字段zoneid是不是主键。表名:test_table01 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 where Key_name = 'PRIMARY' and Column_name ='zoneid' and Seq_in_index = 1 
2018-06-14 18:15:09 1348 [Note] 第7步:字段zoneid不是主键。表名:test_table01 
2018-06-14 18:15:09 1348 [Note] 第8步:开始验证 字段zoneid是不是主键。表名:test_table01 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 where Key_name = 'PRIMARY' and Column_name ='zoneid' and Seq_in_index = 1 
2018-06-14 18:15:09 1348 [Note] 第9步:字段zoneid不是主键。表名:test_table01 
2018-06-14 18:15:09 1348 [Note] 第10步:开始验证表中是否已存在相关索引。表名:test_table01, 字段名:zoneid, 在索引中的位置:1 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 where Column_name ='zoneid' and Seq_in_index =1 
2018-06-14 18:15:09 1348 [Note] 第11步:开始验证 字段views是不是主键。表名:test_table01 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 where Key_name = 'PRIMARY' and Column_name ='views' and Seq_in_index = 1 
2018-06-14 18:15:09 1348 [Note] 第12步:字段views不是主键。表名:test_table01 
2018-06-14 18:15:09 1348 [Note] 第13步:开始验证表中是否已存在相关索引。表名:test_table01, 字段名:views, 在索引中的位置:2 
2018-06-14 18:15:09 1348 [Note] show index from test_table01 where Column_name ='views' and Seq_in_index =2 
2018-06-14 18:15:09 1348 [Note] 第14步:开始输出表test_table01索引优化建议: 
~~*2018-06-14 18:15:09 1348 [Note] CreateIndexSQL:alter table testtable01 add index idxzoneidviews(zoneid,views) *~~
2018-06-14 18:15:09 1348 [Note] 第15步: SQLAdvisor结束! 

可以看到,最后给出了创建索引的建议

测试四:多条SQL同时分析:

[admin@git-server sqladvisor]# cat /opt/SQLAdvisor/sqladvisor/test.cnf 
[sqladvisor]
username=admin
password=test@6666
host=127.0.0.1
port=3306
dbname=zhangyou
sqls=select * from test_table01 where  zoneid=42 and views=198;select * from test_table01 where day='2016-04-22' and uid=26';
[admin@git-server sqladvisor]# 

来源

SQL索引优化工具SQLAdvisor介绍 原创
SQL优化工具SQLAdvisor使用
SQLAdvisor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AntDB 企业增强特性介绍——分布式集群下强一致备份恢复技术

AntDB 使用 barman 实现数据的备份和恢复,但是集群节点部署在多台主机上,每个节点单独备份和恢复。多台服务器时钟不同步的情况下同时备份后, 无法真正实现基于时间点的数据完全和不完全恢复。AntDB 提供基于时间点的全局一致性备份恢复。 A…

【趣味JavaScript】我的天! 居然工作了5年的前端开发都不知道eval函数其中居然暗藏玄机!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

【redis-初级】

文章目录 1.非关系型数据库(NoSQL)2.在Linux上安装redis2.1 安装前准备2.2 安装2.3 启动2.4 关闭 3. redis客户端3.1 命令客户端3.2redis远程客户端3.3 redis编程客户端 1.非关系型数据库(NoSQL) 2.在Linux上安装redis 2.1 安装前…

抑郁症评估干预系统开发 还你美好人生

随着时代的发展,生活压力越来越大,抑郁症似乎也成为了很常见的心理健康问题,让很多家庭苦不堪言,轻者痛苦折磨,重者甚至会出现自虐自杀,所以人们也越来越重视心理健康问题,想要摆脱抑郁症的束缚…

HP DA1023电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件配置 硬件型号驱动情况 主板HP DA1023 处理器Intel(R) Core(TM) i5-8265U已驱动 内存8 GB 2400 MHz DDR4.已驱动 硬盘Samsung SSD 980 250GB(macOS)已驱动 显卡I…

从零开始 Spring Boot 37:初始化 ApplicationContext

从零开始 Spring Boot 37:初始化 ApplicationContext 图源:简书 (jianshu.com) 从前文可以知道,作为 Ioc 容器的 ApplicationContext,需要进行一系列步骤来初始化以最终就绪(对于 Web 应用来说就是可以提供Http服务&a…

[PyTorch][chapter 39][nn.Module]

前言: pytorch.nn是专门为神经网络设计的模块化接口. nn构建于autograd之上,可以用来定义和运行神经网络.是所有类的父类. 目录: 基本结构 常用模块 container(容器) CPU,GPU 部署 train-test 环境切换 flatten MyLinear 一…

【kali】设置系统方式为中文

目录 1、右击终端 2、输入命令回车 3、需要输入当前账户密码 4、选择语言 5、再次确定 6、输入命令重启 1、右击终端 2、输入命令回车 sudo dpkg-reconfigure locales 3、需要输入当前账户密码 4、选择语言 依次选中en_US.UTF-8 / zh_CN.GBK(没找到&#xf…

野火启明RenesasRA4M2 UDS诊断bootloader 升级MCU

基于can总线的UDS软件升级 最近学习UDS诊断协议(ISO14229),是一项国际标准,为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求,并没有设计通信机制。ISO14229仅对应用层和会话层做出了…

微信一天可以加多少个好友?

微信作为最大的私域流量池,几乎所有的人都会往微信引流,而微信每天加好友数量是有严格限制的。微信每天加多少人不会封号?微信每天加多少好友才不会被限制?微信频繁加好友被限制怎么办?请跟随小编的脚步一起往下看吧。…

IP地址定位原理

IP地址定位是一种通过IP地址来确定位置的技术,在互联网和移动网络的应用十分广泛。本文将介绍IP地址定位的原理和实现方式。 IP地址定位原理 IP地址是Internet Protocol(简称IP)的缩写,是互联网上的一个地址标识符用于识别连接到…

合成化学物:169219-08-3,Fmoc-Thr(Ac4Manα)-OH,一种甘露糖苏氨酸

Fmoc-Thr(Ac4Manα)-OH,甘露糖苏氨酸,供应商:陕西新研博美生物科技有限公司产品结构式: 产品规格: 1.CAS号:169219-08-3 2.分子式:C33H37NO14 3.分子量:671.65 4.包装规格&#xff1…

K8s in Action 阅读笔记——【14】Securing cluster nodes and the network

K8s in Action 阅读笔记——【14】Securing cluster nodes and the network 迄今为止,创建了 Pod 而不考虑它们允许消耗多少 CPU 和内存。但是,正如将在本章中看到的那样,设置 Pod 预期消耗和允许消耗的最大数量是任何 Pod 定义的重要部分。…

如何进行JMeter分布式压测?一个案例教你详细解读!

目录 引言 一、什么是压力测试? 二、什么是分布式测试? 三、为什么要使用分布式压力测试? 四、主流压力测试工具对比 五、Jmeter分布式压测原理 六、Jmeter分布式压测前的准备工作 七、阿里云服务器上进行分布式压测 八、系统架构学…

ATTCK v13版本战术介绍——凭证访问(二)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权、防御规避战术,本期我们为大家介绍ATT&CK 14项战术中凭证访问战术第7-12种子技术,后续会介绍凭证访问其他子技术,敬请关注。 二、ATT&…

这两个小众的资源搜索工具其实很好用

01 小不点搜索是一个中国网络技术公司开发的网盘搜索引擎,该网站通过与多个主流网盘进行整合,为用户提供一种快速查找和下载文件的方式。小不点搜索因其高效性、便利性和实用性受到了广大用户的喜爱。 在技术实现上,小不点搜索拥有先进的搜…

C++项目打包成可调用dll文件python调用

目录 1.原项目如图 2.直接在项目对应地方新增dll.h,dll.cpp 3.改变工程的配置类型---动态库(.dll) 4.生成解决方案----可调用dll文件 5.查找dll依赖的其他dll 6.python调用dll 7.python调用dll打包成exe 相关dll要放一个文件夹 1.原项目如图 包括头文件uiaccess.h&#xff0…

Linux中Crontab(定时任务)命令详解及使用教程

Crontab介绍:Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?…

【云计算】Ubuntu多种安装docker方式

文章目录 前言一、docker官网二、安装docker1、第一种方式(官方)2、使用脚本安装(阿里云):3、使用官方脚本安装:拉取镜像(solo博客部署) 前言 Docker是一款开源的容器化平台&#x…

Misc(4)

RAR 打开是个加密压缩文件,给了提示说是4位纯数字加密 暴力破解为4位数字,获得flag QR 下载下来是一个二维码 很简单,利用工具一下就解出来了 镜子里的世界 打开后是一张图片,根据题目的提示,猜想可能是镜像翻转后得到…