截取查询分析

1. 慢查询日志

1.1 是什么

(1)MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。

(2)具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。

(3)由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合之前explain进行全面分析。

1.2 怎么用

默认情况下,MySQL 数据库没有开启慢查询日志,需要我们手动来设置这个参数。
当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。

(1) 开启设置
SHOW VARIABLES LIKE '%slow_query_log%';
查看慢查询日志是否开启 默认情况下 slow_query_log 的值为 OFF,表示慢查询日志是禁用的

set global slow_query_log=1;
开启慢查询日志

SHOW VARIABLES LIKE 'long_query_time%';
查看慢查询设定阈值 单位秒

set long_query_time=1
设定慢查询阈值 单位秒

(2) 如永久生效需要修改配置文件 my.cnf 中[mysqld]下配置

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=3
log_output=FILE

(3) 运行查询时间长的 sql,打开慢查询日志查看

select sleep(4);

1.3 日志分析工具 mysqldumpslow

(1) 查看mysqldumpslow的帮助信息
在这里插入图片描述
-s --------是表示按照何种方式排序
c --------访问次数
l --------锁定时间
r --------返回记录
t --------查询时间
al --------平均锁定时间
ar --------平均返回记录数
at --------平均查询时间
-t --------即为返回前面多少条的数据
-g-------- 后边搭配一个正则匹配模式,大小写不敏感的

(2) 查看mysqldumpslow的帮助信息

得到返回记录集最多的 10SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log

得到访问次数最多的 10SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log

得到按照时间排序的前 10 条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log

另外建议在使用这些命令时结合 | 和 more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log | more

2. show profile

是什么:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量,类似明细条
利用 show profile 可以查看 sql 的执行周期!

默认情况下,参数处于关闭状态,并保存最近15次的运行结果

2.1 开启 profile

查看 profile 是否开启:show variables like ‘%profiling%’
在这里插入图片描述
如果没有开启,可以执行 set profiling=1 (set profiling=on)开启!

2.2 使用 profile

执行 show prifiles 命令,可以查看最近的几次查询。
在这里插入图片描述
根据 Query_ID,可以进一步执行 show profile cpu,block io for query Query_id 来查看 sql 的具体执行步骤。
在这里插入图片描述
诊断SQL,show profile type for query n (n为上一步前面的问题SQL数字号码);
参数备注
type:
| ALL --显示所有的开销信息
| BLOCK IO --显示块IO相关开销
| CONTEXT SWITCHES --上下文切换相关开销
| CPU --显示CPU相关开销信息
| IPC --显示发送和接收相关开销信息
| MEMORY --显示内存相关开销信息
| PAGE FAULTS --显示页面错误相关开销信息
| SOURCE --显示和Source_function,Source_file,Source_line相关的开销信息
| SWAPS --显示交换次数相关开销的信息

日常开发需要注意的结论

  • converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬了。
  • Creating tmp table 创建临时表; 拷贝数据到临时表,用完再删除。
  • Copying to tmp table on disk 把内存中临时表复制到磁盘
  • locked

2.3 大致的查询流程

mysql 的查询流程大致是:

       mysql 客户端通过协议与 mysql 服务器建连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析,也就是说,在解析查询之前,服务器会先访问查询缓存(query cache)——它存储 SELECT 语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。

       语法解析器和预处理:首先 mysql 通过关键字将 SQL 语句进行解析,并生成一颗对应的“解析树”。mysql 解析
器将使用 mysql 语法规则验证和解析查询;预处理器则根据一些 mysql 规则进一步检查解析数是否合法。

       查询优化器当解析树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式,
最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。

       然后,mysql 默认使用的 BTREE 索引,并且一个大致方向是:无论怎么折腾 sql,至少在目前来说,mysql 最多只
用到表中的一个索引。

2.4 SQL 的执行顺序
手写的顺序:
在这里插入图片描述
真正执行的顺序:
随着 Mysql 版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动
态调整执行顺序。下面是经常出现的查询顺序:
在这里插入图片描述

2.5 MyISAM 和 和 InnoDB
在这里插入图片描述
在这里插入图片描述
show engines:查看所有的数据库引擎
在这里插入图片描述

show variables like ‘%storage_engine%’ 查看默认的数据库引擎
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值