服务化-mysql-07 实战分析mysql慢查询

服务化-mysql-07 从架构师角度理解mysql优化

一、慢查询优化

1.1 慢查询配置
1.1.1 开启慢查询及配置默认慢的阈值
  • mysql8.0默认慢查询开关(OFF关)

  • show variables like ‘slow_query_log’;

  • 在这里插入图片描述

  • 手动开启(上图为开启后效果)

    set GLOBAL slow_query_log=1;

  • 检查默认慢查询时间阈值

    show VARIABLES like ‘long_query_time’;
    在这里插入图片描述

  • 修改慢查询阈值

    #自行根据业务场景配置

    set global long_query_time=1;
    在这里插入图片描述

1.1.2 配置全表扫描的语句记录至慢查询日志
  • 开启全表扫描记录值慢查询

    set global log_queries_not_using_indexes=on;
    在这里插入图片描述

  • 慢查询输出位置

show variables like ‘log_output’;

#修改输出慢查询日志的位置为文件或记录到表中

#默认存在日志中即可

set global log_output=‘FILE,TABLE’;

在这里插入图片描述

1.2 慢查询日志分析
1.2.1 mysqldumpslow慢查询日志排序

./mysqldumpslow -s r -t 10 slow-mysql.log

-s order (c,t,l,r,at,al,ar)

​ c:总次数

​ t:总时间

​ l:锁的时间

​ r:获得的结果行数

-s 对结果进行排序,怎么排,根据后面所带的 (c,t,l,r,at,al,ar),缺省为at

-t NUM just show the top n queries:仅显示前n条查询

-g PATTERN grep: only consider stmts that include this string:通过grep

来筛选语句。

1.2.2 pt-query-digest

依赖于python的查询慢查询的工具,比mysqldumpslow好用

1.3、手动分析线程状态及sql执行的耗时情况

1.3.1 show processlist;
在这里插入图片描述

https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html

Mysql官网中定义了服务器中线程的状态值,诸如:

starting[语句执行开始的第一阶段]

preparing[查询优化器期间]

statistics[分析查询计划]

System lock[普遍状态]

Writing to net[服务器正在向网络写入数据包。]

如果statistics正占用大量的时间,则可能存在异常。

1.3.2 show profile分析SQL

分析线程在执行sql语句时,具体耗时在哪里。

查看是否支持profile

select @@have_profiling;
在这里插入图片描述

  • profiling默认关闭,需要手动开启session级别诊断

    select @@profiling;

    set profiling=1;
    在这里插入图片描述

  • 执行需要分析的sql语句

    select count(*) from price;

  • 通过show profiles语句,看到当前SQL的Query ID

    show profiles;
    在这里插入图片描述

  • 通过show profile for query语句能够看到执行过程中线程的每个状态和消耗的时间

    show profile for query 4;

    此时发现全表扫描一张1200w数据的表,耗时主要在执行上,executing耗时8.36s。
    在这里插入图片描述

  • 在获取到最消耗时间的线程状态后,MySQL 支持进一步选择all、cpu、block io、contextswitch、page faults等明细类型来查看MySQL在使用什么资源上耗费了过高的时间

    show profile all for query 4\G

    发现耗时主要是在CPU上,数据量太大或CPU处理器性能一般,前者的可能性更大些。
    在这里插入图片描述

  • 对比mysql官方文档查看具体耗时原因

    NULL值是因为windows上不支持查看,另外明显看出用户使用CPU时间+系统CPU时间 > Duration耗时,分析可能是系统函数的调用不支持,或者 看sql_union.cc的第1127行源码继续分析。

    https://dev.mysql.com/doc/refman/8.0/en/show-profile.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

旧梦昂志

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

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

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

打赏作者

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

抵扣说明:

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

余额充值