基于mysql的SQLadvisor工具一次优化尝试
使用方式:
1> 安装SQLAdvisor
[root@SQLAdvisor ~]# getenforce
Disabled
[root@SQLAdvisor ~]# yum -y install cmake libaio-devel libffi-devel glib2 glib2-devel
复制
2> 配置Percona56 yum源;
$ yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
复制
安装Percona-Server-shared-56;
$ yum install Percona-Server-shared-56
复制
3> 查看版本,测试是否安装成功。
[root@xjfw3 ~]# cmake --version
cmake version 3.10.0-rc4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
复制
4> 建立软连接
[root@SQLAdvisor ~]# ln -s usr/lib64/libperconaserverclient_r.so.18 usr/lib64/libperconaserverclient_r.so
复制
5> 编译依赖项sqlparser
[root@SQLAdvisor ~]# cd SQLAdvisor/
[root@SQLAdvisor SQLAdvisor]# cmake -DBUILD_CONFIG=mysql_release -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr/local/sqlparser ./
[root@SQLAdvisor SQLAdvisor]# make && make install
复制
6> 安装SQLAdvisor
[root@SQLAdvisor SQLAdvisor]# cd sqladvisor/
[root@SQLAdvisor sqladvisor]# cmake -DCMAKE_BUILD_TYPE=debug ./
[root@SQLAdvisor sqladvisor]# make
[root@SQLAdvisor sqladvisor]# ./sqladvisor --help
复制
####################测试环境下的一次测试#######################
mysql> create database test1 character set utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> create table user(
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(64) NOT NULL,
-> age int,
-> sex int
-> )ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.13 sec)
mysql> desc user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
* 生成测试数据
mysql> insert into user(name,age, sex) select 'lisea', 25, 1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
生产测试数据
insert into user(name,age, sex) select concat(name, '1'), age+1, sex+1 from user;
insert into user(name,age, sex) select concat(name, '2'), age+2, sex from user;
insert into user(name,age, sex) select concat(name, '3'), age+2, sex from user;
insert into user(name,age, sex) select concat(name, '10'), age+2, sex from user;
insert into user(name,age, sex) select concat(name, '11'), age+4, sex from user;
--执行两次
结果
[mysql@mysql sqladvisor]$ ./sqladvisor -h 192.168.226.131 -P 16063 -u root -p '6yhn^YHN' -d test1 -q "select * from user where name = 'lisea'" -v 1
2019-10-24 07:36:20 35965 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `test1`.`user` where (`name` = 'lisea')
2019-10-24 07:36:20 35965 [Note] 第2步:开始解析where中的条件:(`name` = 'lisea')
2019-10-24 07:36:20 35965 [Note] show index from user
2019-10-24 07:36:20 35965 [Note] show table status like 'user'
2019-10-24 07:36:20 35965 [Note] select count(*) from ( select `name` from `user` FORCE INDEX( PRIMARY ) order by id DESC limit 10000) `user` where (`name` = 'lisea')
2019-10-24 07:36:20 35965 [Note] 第3步:表user的行数:1045485,limit行数:10000,得到where条件中(`name` = 'lisea')的选择度:10000
2019-10-24 07:36:20 35965 [Note] 第4步:开始验证 字段name是不是主键。表名:user
2019-10-24 07:36:20 35965 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='name' and Seq_in_index = 1
2019-10-24 07:36:20 35965 [Note] 第5步:字段name不是主键。表名:user
2019-10-24 07:36:20 35965 [Note] 第6步:开始验证 字段name是不是主键。表名:user
2019-10-24 07:36:20 35965 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='name' and Seq_in_index = 1
2019-10-24 07:36:20 35965 [Note] 第7步:字段name不是主键。表名:user
2019-10-24 07:36:20 35965 [Note] 第8步:开始验证表中是否已存在相关索引。表名:user, 字段名:name, 在索引中的位置:1
2019-10-24 07:36:20 35965 [Note] show index from user where Column_name ='name' and Seq_in_index =1
2019-10-24 07:36:20 35965 [Note] 第9步:开始输出表user索引优化建议:
2019-10-24 07:36:20 35965 [Note] Create_Index_SQL:alter table user add index idx_name(name)
2019-10-24 07:36:20 35965 [Note] 第10步: SQLAdvisor结束!
也可配置文件传参调用
[root@SQLAdvisor sqladvisor]# cat sql.cnf
[sqladvisor]
username=root
password=123
host=127.0.0.1
port=3306
dbname=test1
sqls=select * from user where name = 'lisea'
[root@SQLAdvisor sqladvisor]# ./sqladvisor -f sql.cnf -v 1
复制
文章转载自数据与人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
2942次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
849次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
492次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
429次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
372次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
286次阅读
2025-04-30 17:37:37
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
277次阅读
2025-04-15 15:27:53
SQL优化 - explain查看SQL执行计划(下)
金同学
266次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
248次阅读
2025-04-30 12:17:54
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
230次阅读
2025-04-28 11:01:25