zoukankan      html  css  js  c++  java
  • mysql之慢sql与pt-query-digest

     参考文章

    《数据库优化——慢查询MySQL定位优化流程》

    《MySQL慢查询分析工具pt-query-digest详解》

    写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。

     

    一、 慢sql

    我们将查询时间超出一定阈值的sql称为慢sql,mysql提供了慢sql日志帮助我们进行优化分析

    慢sql相关参数:

    (1)是否开启慢sql日志:slow_query_log,使用

    set global slow_query_log=on;

    开启慢sql记录

    (2)慢sql阈值:long_query_time

    使用

    set global long_query_time=1;

    记录查询时间大于1秒的sql

    (3)慢sql日志路径:slow_query_log_file

    默认slow.log,路径为mysql的data目录下

    (4)是否记录未使用索引的查询 log_queries_not_using_indexes

    记录未使用索引的sql:

    set global log_queries_not_using_indexes=on

    (5)sql扫描行数大于 min_examined_row_limit 时才记录

    sql扫描行数大于100时才记录

    set global min_examined_row_limit=100;

    二、 pt-query-digest

    我们利用mysql日志分析工具对slow.log进行分析(慢sql只能记录已经查询完的sql,正在执行的慢sql则无法记录,

    不过可以使用show full processlist查看正在运行的sql,不过这个更接近运维的范畴,这里不做深入讲解,有兴趣的

    可以移步这里看下《MySQL show processlist说明》

    比如我们对2021年7月5日下午1点到5点的慢sql日志进行分析

    pt-query-digest slow.log --since '2021-07-05 13:00:00' --until '2021-07-05 17:00:00' -->/tmp/slow_0705.report

    --since 从什么时间开始分析,值为字符串,可以是指定的某个”yyyy-mm-dd [hh:mm:ss]”格式的时间点,也可以是简单的一个时间值:s(秒)、h(小时)、m(分钟)、d(天)

    ,如12h就表示从12小时前开始统计。

    --until 截止时间,配合—since可以分析一段时间内的慢查询。

    (1)第一部分:总体情况

    Overall:查询总数、唯一查询数量、QPS、并发

    Time range:查询的时间范围

    Exec time :执行时间

    Lock time:被阻塞时间

    Rows sent:查询返回行数

    Rows examine : 查询扫描行数

    query size : 查询数据量

    total:总计 min:最小 max:最大 avg:平均

    95%:把所有值从小到大排列,位于95%的值

    median:中位数,把所有值从小到大排列,位于中间的值

    (2)第二部分:查询分组统计结果

    Rank:所有语句的排名,默认按查询时间降序排列

    Query ID:查询的ID (有说法是sql id 去掉空格和文本字符后计算的hash)

    Response:总执行时间

    time:该查询在本次分析中总的时间占比

    calls:执行次数,即本次分析总共有多少条这种类型的查询语句

    R/Call:平均每次执行的响应时间

    V/M:响应时间Variance-to-mean的比率

    Item:查询对象(记录了查方法与涉及到的表等信息)

    (3)第三部分:每个查询的详细统计结果

    Query:对应第二部分中的Rank排名

    ID:查询ID号,即第二部分中的Query ID对应

    Time range:查询时间范围

    Attribute:针对此类查询的统计

    Databases:数据库名

    Hosts:执行查询的IP分布(占比)

    Users:各个用户执行的次数(占比)

    Query_time distribution :查询时间分布, 长短体现区间占比。

    Tables :查询中涉及到的表

    EXPLAIN :显示具体的sql

    三、 explain

    在分析完后,我们确定了存在异常的sql,那么接下来就要对其进行进一步的解析与优化。

    之前在索引介绍里简单介绍了下explain,这里再做下补充

    使用explain对慢sql分析日志中的异常sql再进行详细分析,就可以有针对性的进行sql优化,

    比如是调整sql写法还是增加索引。

    争取早日不再是一只菜鸡
  • 相关阅读:
    JS 利用数组拼接html字符串
    IE浏览器下读取客户端上传的文件大小
    PrintWriter out = response.getWriter() 输出中文乱码问题
    非常有用的Java程序片段
    sql之left join、right join、inner join的区别
    JAVA 数组常用技巧
    java 图片文件格式转换(多页tif转jpg 、jpg转tif)
    SQL Server 字段状态判断语句
    sql server 2008中id如何设为自增
    java基于xml配置的通用excel单表数据导入组件(五、Action处理类)
  • 原文地址:https://www.cnblogs.com/jchen104/p/15113624.html
Copyright © 2011-2022 走看看