# 性能剖析介绍

  • 性能剖析是测量和分析时间花费在哪里的主要方法。
  • 性能剖析一般有两个步骤:测量任务所花费的时间,然后对结果进行统计和排序,将重要的任务排到前面。
  • 完成一项任务所需要的时间可以分为两部分:执行时间和等待时间。
  • 值得优化的查询是那些占总响应时间比重大的,也就是说优化收益大的。
  • 某些任务即使没有出现在性能剖析输出的前面也要优化,比如异常情况。
  • 好的性能剖析工具应该显示可能的丢失时间,也就是任务的总时间和实际测量的时间之差。
  • 性能剖析无法显示所有响应时间的分布,不能只相信平均值,可以使用直方图、百分比、标准差等来分析。

# 剖析 MySQL 查询

  1. 剖析服务负载
    1. 捕获慢查询日志,开启慢查询设置
    2. 分析慢查询日志,找到最慢的几个查询
  2. 剖析单条查询
    1. show profile
      1. set profiling = 1,设置开启剖析工具
      2. show prifiles,查询开启期间的所有查询的耗时,展示字段:Query_ID, Duration, Query
      3. show profile for query {Query_ID},详细分析 2 中耗时比较久的查询,展示字段:Status, Duration,按照顺序展示各个阶段的耗时,无法按照耗时排序,可以直接从 INFORMATION_SCHEMA.PROFILING 表中查询
    2. show status
      1. flush status,刷新计数
      2. show status,查看计数,展示字段:Varaible_name, Value,可通过 show status where Variable_name like 进行过滤
    3. 慢查询日志
      1. 分析会比 show profile 详细些
      2. 通过分析工具可查找慢查询在日志中的具体位置
      3. 可记录 show profile 和 show status
    4. Performance Schema

# 诊断间歇性问题

  1. 先确认是单条查询的问题,还是服务器的问题
    1. 服务器问题,可以升级到 MySQL 最新版
    2. 单条查询问题
      1. show global status,可以使用 mysqladmin 获取数据,分析每秒查询数,线程连接数,线程执行数等
      2. show processlist,可以观察是否有大量线程处于不正常的状态或者其他不正常的特征
      3. 使用查询日志,可以分析每个时间点的吞吐量等
  2. 捕获诊断数据
    1. 诊断触发器,即区分问题何时出现的方法
    2. 收集诊断数据的工具,在需要时间段内尽可能收集多的数据,如:系统的状态、CPU 利用率、磁盘使用率和可用空间、ps 的输出采样、内存利用率等,以及从 MySQL 获取的信息,如:show status、show processlist、show innodb status 等
    3. 解释结果数据,检查问题是否真的发生了,以及是否有非常明显的跳跃性变化