Mysql—性能分析:为何调优【知识前缀】

目录

数据库服务器的优化步骤

定位执行慢的 SQL:慢查询日志 

开启慢查询日志参数 

慢查询日志分析工具:mysqldumpslow 

查看 SQL 执行成本:SHOW PROFILE

分析查询语句:EXPLAIN 


数据库服务器的优化步骤

当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。 整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。字母 S 的部分代表观察(会使 用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。

 

分析:①:观察服务器是否存在波动 ,存在:加入缓存或者更改缓存策略 (Mysql8.0开始没有缓存了)

           ②:①未解决,仍有不规则延迟或卡顿,开启慢查询,通过一些工具定位问题

           ③:发现SQL等待时间过长,调优服务器参数(缓冲池等)

           ④:发现SQL执行时间过长,索引优化,数据表设计优化(字段是否合理,范式问题,JOIN表过多优化

           ⑤:③、④未解决,要进行读写分离,分库分表(用资源、空间换取时间的最终计划)

 

定位执行慢的 SQL:慢查询日志 

开启慢查询日志参数 

概念:

session:当前会话,也就是当前连接。

global:全局,不包含当前连接,之后新获取的连接都会生效。

1.开启慢查询日志  开启slow_query_log

mysql > set global slow_query_log='ON';

你能看到慢查询分析已经开启,同时文件保存在 mysql安装目录的data目录下  主机名-slow文件中 

2. 修改long_query_time阈值

mysql > show variables like '%long_query_time%';

查看默认10s 

这里如果我们想把时间缩短,比如设置为 1 秒,可以这样设置:

#测试发现:设置global的方式对当前session的long_query_time失效。对新连接的客户端有效。所以可以一并
执行下述语句
mysql > set global long_query_time = 1;
mysql> show global variables like '%long_query_time%';       #当前连接立刻生效
mysql> set long_query_time=1; 
mysql> show variables like '%long_query_time%';                #当前连接不生效

 当然,用命令行都是临时生效配置,下次重启就无了,可以修改配置文件my.ini(windows)

log-slow-queries = E:\web\mysql\log\mysqlslowquery.log
long_query_time = 2
slow_query_log=ON

 3.查看慢查询数目

SHOW GLOBAL STATUS LIKE '%Slow_queries%';

慢查询日志分析工具:mysqldumpslow 

 接下来的操作要在Linux中进行

在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具 mysqldumpslow 。 查看mysqldumpslow的帮助信息

mysqldumpslow --help 

 mysqldumpslow 命令的具体参数如下:

 举例:我们想要按照查询时间排序,查看前五条 SQL 语句,这样写即可:

mysqldumpslow -s t -t 5 /var/lib/mysql/atguigu01-slow.log

 工作常用参考:

#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
#另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

查看 SQL 执行成本:SHOW PROFILE

 Show Profile是MysQL提供的可以用来分析当前会话中SQL都做了什么、执行的资源消耗情况的工具,可用于sql调优的测量。默认情况下处于关闭状态,并保存最近15次的运行结果。
我们可以在会话级别开启这个功能

通过设置 profiling='ON’ 来开启 show profile:

mysql > set profiling = 'ON';

 然后执行相关的查询语句。接着看下当前会话都有哪些 profiles,使用下面这条命令:

mysql > show profiles;

 你能看到当前会话一共有 2 个查询。如果我们想要查看最近一次查询的开销,可以使用:

mysql > show profile;

mysql> show profile cpu,block io for query 2;      #查看某一行的其他信息(cpu,blockio)

分析查询语句:EXPLAIN 

Explain概述

 定位了查询慢的SQL之后,我们就可以使用EXPLAIN或DESCRIBE工具做针对性的分析查询语句。DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。

MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供它认为最优的执行计划(他认为最优的数据检索方式,但不见得是DBA认为是最优的,这部分最耗费时间)。

这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。MySQL为我们提供了EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,大家看懂EXPLAIN语句的各个输出项,可以有针对性的提升我们查询语句的性能。

EXPLAIN或DESCRIBE工具能做什么

表的读取顺序

数据读取操作的

操作类型哪些索引可以使用

哪些索引被实际使用

表之间的引用

每张表有多少行被优化器查询

官方文档:

MySQL :: MySQL 5.7 Reference Manual :: 8.8.2 EXPLAIN Output Format

MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format

版本情况

MySQL 5.6.3以前只能 EXPLAIN SELECT ;

MYSQL 5.6.3以后就可以 EXPLAIN SELECT,UPDATE, DELETE

在5.7以前的版本中,想要显示 partitions 需要使用 explain partitions 命令;想要显示 filtered 需要使用 explain extended 命令。在5.7版本后,默认explain直接显示partitions和 filtered中的信息。 

 基本语法

EXPLAIN 或 DESCRIBE语句的语法形式如下:

EXPLAIN SELECT select_options
或者
DESCRIBE SELECT select_options

如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个 EXPLAIN ,就像这样:

mysql> EXPLAIN SELECT 1;

输出的上述信息就是所谓的执行计划。在这个执行计划的辅助下,我们需要知道应该怎样改进自己的查询语句以使查询执行起来更高效。其实除了以SELECT开头的查询语句,其余的DELETE、INSERT、REPLACE 以及UPDATE语句等都可以加上EXPLAIN,用来查看这些语句的执行计划,只是平时我们对SELECT语句更感兴趣。

注意:执行EXPLAIN时并没有真正的执行该后面的语句,因此可以安全的查看执行计划。

EXPLAIN语句输出的各个列的作用如下: 

 各字段含义:[MySQL高级](一) EXPLAIN用法和结果分析_王洪玉的博客-CSDN博客_explain的用法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JagTom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值