iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL--------SQL优化审核工具实战
  • 524
分享到

MySQL--------SQL优化审核工具实战

2024-04-02 19:04:59 524人浏览 薄情痞子
摘要

1. 背景   sqlAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具。它基于Mysql原生态词法解析,结合分析SQL中的wher

1. 背景

   sqlAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具。它基于Mysql原生态词法解析,结合分析SQL中的where条件、聚合条件、多表Join关系 给出索引优化建议。目前SQLAdvisor在美团点评内部广泛应用,公司内部对SQLAdvisor的开发全面转到GitHub上,开源和内部使用保持一致。


    在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务。例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率。


    目前常用的SQL优化方式包括但不限于:业务层优化、SQL逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到SQL优化的目的。索引优化往往可以在短时间内产生非常巨大的效果。如果能够将索引优化转化成工具化、标准化的流程,减少人工介入的工作量,无疑会大大提高DBA的工作效率。


2. 架构流程图

MySQL--------SQL优化审核工具实战


3. 环境

   * os version

[root@SQLAdvisor ~]# cat /etc/redhat-release 
Centos release 6.8 (Final)

[root@SQLAdvisor ~]# uname -r
2.6.32-642.3.1.el6.x86_64

[root@SQLAdvisor ~]# uname -n
SQLAdvisor

[root@SQLAdvisor ~]# getenforce 
Disabled


   * mysql version

mysql> show variables like 'version';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| version       | 5.7.18 |
+---------------+--------+
1 row in set (0.00 sec)


4. 安装SQLAdvisor

   * 获取最新代码

[root@SQLAdvisor ~]# git clone https://github.com/Meituan-Dianping/SQLAdvisor.git
Initialized empty Git repository in /root/SQLAdvisor/.git/
remote: Counting objects: 1460, done.
remote: Total 1460 (delta 0), reused 0 (delta 0), pack-reused 1460
Receiving objects: 100% (1460/1460), 19.92 MiB | 209 KiB/s, done.
Resolving deltas: 100% (368/368), done.


   * 安装依赖项

[root@SQLAdvisor ~]# yum -y  install cmake libaio-devel libffi-devel glib2 glib2-devel

[root@SQLAdvisor ~]# yum -y  install  Http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
 
[root@SQLAdvisor ~]# yum -y  install Percona-Server-shared-56 

[root@SQLAdvisor ~]# ln -s /usr/lib64/libperconaserverclient_r.so.18 /usr/lib64/libperconaserverclient_r.so


   * 编译依赖项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


   * 安装SQLAdvisor

[root@SQLAdvisor SQLAdvisor]# cd sqladvisor/

[root@SQLAdvisor sqladvisor]# cmake -DCMAKE_BUILD_TYPE=debug ./

[root@SQLAdvisor sqladvisor]# make


   * SQLAdvisor Info

[root@SQLAdvisor 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


5. 测试

   * 生成测试数据表

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

mysql> insert into user(name,age, sex) select concat(name, '1'), age+1, sex+1 from user;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into user(name,age, sex) select concat(name, '2'), age+2, sex from user;
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into user(name,age, sex) select concat(name, '3'), age+2, sex from user;
Query OK, 4 rows affected (0.18 sec)
Records: 4  Duplicates: 0  Warnings: 0

.
.
.
.
.
.

mysql> insert into user(name,age, sex) select concat(name, '10'), age+2, sex from user;
Query OK, 512 rows affected (0.24 sec)
Records: 512  Duplicates: 0  Warnings: 0

mysql> insert into user(name,age, sex) select concat(name, '11'), age+4, sex from user;
Query OK, 1024 rows affected (0.79 sec)
Records: 1024  Duplicates: 0  Warnings: 0

mysql> select count(1) from user;
+----------+
| count(1) |
+----------+
|     2048 |
+----------+
1 row in set (0.01 sec)


   * 命令行传参调用测试SQLAdvisor [查找非索引行]

[root@SQLAdvisor sqladvisor]# ./sqladvisor -h 127.0.0.1  -P 3306  -u root -p '123' -d test1 -q "select * from user where name = 'lisea'" -v 1
2017-10-27 05:35:49 34059 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `test1`.`user` where (`name` = 'lisea') 

2017-10-27 05:35:49 34059 [Note] 第2步:开始解析where中的条件:(`name` = 'lisea') 

2017-10-27 05:35:49 34059 [Note] show index from user 

2017-10-27 05:35:49 34059 [Note] show table status like 'user' 

2017-10-27 05:35:49 34059 [Note] select count(*) from ( select `name` from `user` FORCE INDEX( PRIMARY ) order by id DESC limit 1024) `user` where (`name` = 'lisea')  

2017-10-27 05:35:49 34059 [Note] 第3步:表user的行数:2048,limit行数:1024,得到where条件中(`name` = 'lisea')的选择度:1024 

2017-10-27 05:35:49 34059 [Note] 第4步:开始验证 字段name是不是主键。表名:user 

2017-10-27 05:35:49 34059 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='name' and Seq_in_index = 1 

2017-10-27 05:35:49 34059 [Note] 第5步:字段name不是主键。表名:user 

2017-10-27 05:35:49 34059 [Note] 第6步:开始验证 字段name是不是主键。表名:user 

2017-10-27 05:35:49 34059 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='name' and Seq_in_index = 1 

2017-10-27 05:35:49 34059 [Note] 第7步:字段name不是主键。表名:user 

2017-10-27 05:35:49 34059 [Note] 第8步:开始验证表中是否已存在相关索引。表名:user, 字段名:name, 在索引中的位置:1 

2017-10-27 05:35:49 34059 [Note] show index from user where Column_name ='name' and Seq_in_index =1 

2017-10-27 05:35:49 34059 [Note] 第9步:开始输出表user索引优化建议: 

2017-10-27 05:35:49 34059 [Note] Create_Index_SQL:alter table user add index idx_name(name) 

2017-10-27 05:35:49 34059 [Note] 第10步: SQLAdvisor结束!


   * 命令行传参调用测试SQLAdvisor [查找索引行]

[root@SQLAdvisor sqladvisor]# ./sqladvisor -h 127.0.0.1  -P 3306  -u root -p '123' -d test1 -q "select * from user where id = 1" -v 1
2017-10-27 05:36:46 34062 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `test1`.`user` where (`id` = 1) 

2017-10-27 05:36:46 34062 [Note] 第2步:开始解析where中的条件:(`id` = 1) 

2017-10-27 05:36:46 34062 [Note] show index from user 

2017-10-27 05:36:46 34062 [Note] show table status like 'user' 

2017-10-27 05:36:46 34062 [Note] select count(*) from ( select `id` from `user` FORCE INDEX( PRIMARY ) order by id DESC limit 1024) `user` where (`id` = 1)  

2017-10-27 05:36:46 34062 [Note] 第3步:表user的行数:2048,limit行数:1024,得到where条件中(`id` = 1)的选择度:1024 

2017-10-27 05:36:46 34062 [Note] 第4步:开始验证 字段id是不是主键。表名:user 

2017-10-27 05:36:46 34062 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='id' and Seq_in_index = 1 

2017-10-27 05:36:46 34062 [Note] 第5步:字段id是主键。表名:user 

2017-10-27 05:36:46 34062 [Note] 第6步:表user 经过运算得到的索引列首列是主键,直接放弃,没有优化建议 

2017-10-27 05:36:46 34062 [Note] 第7步: 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
2017-10-27 05:40:14 34070 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `test1`.`user` where (`name` = 'lisea') 

2017-10-27 05:40:14 34070 [Note] 第2步:开始解析where中的条件:(`name` = 'lisea') 

2017-10-27 05:40:14 34070 [Note] show index from user 

2017-10-27 05:40:14 34070 [Note] show table status like 'user' 

2017-10-27 05:40:14 34070 [Note] select count(*) from ( select `name` from `user` FORCE INDEX( PRIMARY ) order by id DESC limit 1024) `user` where (`name` = 'lisea')  

2017-10-27 05:40:14 34070 [Note] 第3步:表user的行数:2048,limit行数:1024,得到where条件中(`name` = 'lisea')的选择度:1024 

2017-10-27 05:40:14 34070 [Note] 第4步:开始验证 字段name是不是主键。表名:user 

2017-10-27 05:40:14 34070 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='name' and Seq_in_index = 1 

2017-10-27 05:40:14 34070 [Note] 第5步:字段name不是主键。表名:user 

2017-10-27 05:40:14 34070 [Note] 第6步:开始验证 字段name是不是主键。表名:user 

2017-10-27 05:40:14 34070 [Note] show index from user where Key_name = 'PRIMARY' and Column_name ='name' and Seq_in_index = 1 

2017-10-27 05:40:14 34070 [Note] 第7步:字段name不是主键。表名:user 

2017-10-27 05:40:14 34070 [Note] 第8步:开始验证表中是否已存在相关索引。表名:user, 字段名:name, 在索引中的位置:1 

2017-10-27 05:40:14 34070 [Note] show index from user where Column_name ='name' and Seq_in_index =1 

2017-10-27 05:40:14 34070 [Note] 第9步:开始输出表user索引优化建议: 

2017-10-27 05:40:14 34070 [Note] Create_Index_SQL:alter table user add index idx_name(name) 

2017-10-27 05:40:14 34070 [Note] 第10步: SQLAdvisor结束!



6. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。


您可能感兴趣的文档:

--结束END--

本文标题: MySQL--------SQL优化审核工具实战

本文链接: https://www.lsjlt.com/news/42842.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL自动审核工具archer
    二、平台介绍 archer 基于inception的自动化SQL操作平台,支持工单、审核、认证、邮件、OSC等功能。 github地址:https://github.com/jly8866/archer 如...
    99+
    2024-04-02
  • SQL业务审核与优化
    转自http://www.cnblogs.com/Aiapple/p/5697229.html 审核 ...
    99+
    2024-04-02
  • 【SQL】sql优化小工具之SQLHC
    SQLHC 是什么东西呢,全称:SQL Tuning Health-Check Script 是 Oracle Server Technologies Center of Expertise 开发的一个工...
    99+
    2024-04-02
  • MySQL中的SQL优化实战记录
    这篇文章主要介绍“MySQL中的SQL优化实战记录”,在日常操作中,相信很多人在MySQL中的SQL优化实战记录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中的S...
    99+
    2024-04-02
  • mysql 优化工具 EXPLAIN详解
    EXPLAIN 是 MySQL 中用于查看查询执行计划的关键字,通过 EXPLAIN 可以了解 MySQL 优化器是如何选择执行查询的。EXPLAIN 的输出信息包括了许多字段,其中一些关键的字段和类别如下: id: 查询的标识符...
    99+
    2024-01-21
    mysql 数据库
  • MySQL优化工具有哪些
    这篇文章将为大家详细讲解有关MySQL优化工具有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。对于正在运行的mysql性能如何?参数设置的是否合理?账号设置的是否存在...
    99+
    2024-04-02
  • oracle10g的em工具优化sql功能
    工作安排,需要在oracle10g进行sql的优化,得知oracle的em工具可以进行系统优化,故如下操作。百度搜到如下链接,本想按照步骤进行sql优化:http://blog.csdn.net/binya...
    99+
    2024-04-02
  • CMS 内容审核的秘密武器:掌握自动化工具
    ...
    99+
    2024-04-02
  • 推荐一款MySQL优化工具
    之前韩锋老师写过一篇关于查看MySQL执行计划的文章,里面解释了一个脚本,是他早先定制的一个还不错的功能。 如何用一款小工具大大加速MySQL SQL语句优化(附源码) 使用细节在文章里介绍...
    99+
    2024-04-02
  • MySQL优化工具AWR都有哪些
    本篇文章为大家展示了MySQL优化工具AWR都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对于正在运行的mysql,性能如何,...
    99+
    2024-04-02
  • 人工智能自动sql优化工具SQLTuning for SQL Server怎么用
    这篇文章将为大家详细讲解有关人工智能自动sql优化工具SQLTuning for SQL Server怎么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。针...
    99+
    2024-04-02
  • MySQL性能诊断和优化工具
    作者:禅与计算机程序设计艺术 1.简介 数据库系统作为一种应用软件,其运行需要大量的计算资源。在生产环境下,数据库服务器经常承受着巨大的压力,而性能是影响数据库系统正常运行的关键因素之一。因此,对数...
    99+
    2023-10-06
    自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
  • MySQL之常用的MySQL优化工具解读
    目录一、mysqlTuner.pl二、tuning-primer三、pt-variable-advisor四、pt-qurey-digest总结影响数据库性能的常见因素如下: (1)磁盘IO; (2)网卡流量; (3)服...
    99+
    2023-02-16
    MySQL优化工具 MySQL常用优化工具 MySQL优化
  • oracle自带工具(自动优化sql小助手)
    1.drop tuning task if task exists (删除之前的优化任务,如果存在的话) sqlplus / as sysdba ...
    99+
    2024-04-02
  • MySQL语句优化辅助工具DBA怎么用
    MySQL语句优化辅助工具DBA怎么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 概述优化SQL,是DBA常见的工作之一。如何高...
    99+
    2024-04-02
  • MySQL分页Limit的优化过程实战
    前言 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。 SELECT * FROM table LIMIT [o...
    99+
    2024-04-02
  • SQL Server携程核心系统无感迁移到MySQL实战
    目录前言一、架构综述二、应用场景1、新单秒级各端同步2、自动发单与工作台3、查询与数据分析三、系统升级实践 1、分布式订单缓存2、无损迁移工艺3、数仓衔接四、核心问题精编1...
    99+
    2024-04-02
  • MySQL核心参数优化文件my.ini实现
    目录一.数据库服务器配置二.CPU的优化三.内存的优化四.IO的优化五.连接的优化六.数据一致性的优化一.数据库服务器配置 CPU:48C内存:128GDISK:3.2TSSD 二.CPU的优化 innodb_threa...
    99+
    2023-01-31
    MySQL my.ini
  • 小米正式开源 SQL 智能优化与改写工具 SOAR
    近日,小米正式宣布开源 SOAR。 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) SO...
    99+
    2024-04-02
  • 分析SQL给出索引优化建议的工具(美团开源)
    分析SQL给出索引优化建议的工具(美团开源) ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作