第三章 服务器性能剖析

(1)性能剖析(profiling):用于测试服务器的时间花费在哪里。

本书对数据库性能的定义:是指完成某件任务所需要的时间度量,即响应时间,每个SQL语句的查询话费的时间。

完成一项任务所需要的时间可以分成两部分:执行时间和等待时间(如IO等待)。

(2)性能剖析有两个步骤:

测量任务所花费的时间;

对结果进行统计分析,均值、方差、分布、计算特定的指标分析等。

(3)性能剖析本身会导致服务器变慢吗?

当然会,因为要做额外的工作付出额外的开销。但是如果性能剖析可以帮助应用程序运行得更快,那么性能剖析就使值得的。

(4)慢查询日志和通用日志

慢查询日志是指捕获所有查询时间超过long_query_time的查询,将其SQL语句和消耗时间记录到日志中。可以设置long_query_time = 0来捕获所有SQL。慢查询日志是开销最低、精度最高的测量查询时间的工具。

通用日志是指查询请求到服务器时记录,不包含响应时间和执行计划等重要信息。

将慢查询日志生成剖析报告的工具:pt-query-digest(十年前给力,2020年需根据实际情况使用更好的工具)。

(5)SHOW PROFILES

SHOW PROFILES 命令可以对每条SQL进行性能剖析,默认是禁用的,使用set profiling = 1打开对当前线程的SQL进行剖析。

SHOW PROFILE FOR QUERY N 命令可以展示记录的id为N的查询每个执行步骤的详细时间记录。

也可以查询每个查询的所有详细步骤信息:SELECT * FROM INFORMATION_SCHEMA.FROFILING;

mysql> set profiling = 1;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select 1;

+---+

| 1 |

+---+

| 1 |

+---+

1 row in set (0.00 sec)

mysql> show profiles;

+----------+------------+----------+

| Query_ID | Duration | Query |

+----------+------------+----------+

| 1 | 0.00043725 | select 1 |

+----------+------------+----------+

1 row in set, 1 warning (0.00 sec)

mysql> select 2;

+---+

| 2 |

+---+

| 2 |

+---+

1 row in set (0.00 sec)

mysql> show profiles;

+----------+------------+----------+

| Query_ID | Duration | Query |

+----------+------------+----------+

| 1 | 0.00043725 | select 1 |

| 2 | 0.00042800 | select 2 |

+----------+------------+----------+

2 rows in set, 1 warning (0.00 sec)

mysql> set profiling = 0;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select 3;

+---+

| 3 |

+---+

| 3 |

+---+

1 row in set (0.00 sec)

mysql> show profiles;

+----------+------------+----------+

| Query_ID | Duration | Query |

+----------+------------+----------+

| 1 | 0.00043725 | select 1 |

| 2 | 0.00042800 | select 2 |

+----------+------------+----------+

2 rows in set, 1 warning (0.00 sec)

mysql> show profile for query 1;

+----------------------+----------+

| Status | Duration |

+----------------------+----------+

| starting | 0.000116 |

| checking permissions | 0.000007 |

| Opening tables | 0.000013 |

| init | 0.000005 |

| optimizing | 0.000008 |

| executing | 0.000051 |

| end | 0.000004 |

| query end | 0.000005 |

| closing tables | 0.000002 |

| freeing items | 0.000043 |

| cleaning up | 0.000186 |

+----------------------+----------+

11 rows in set, 1 warning (0.00 sec)

mysql> select * from information_schema.profiling;

+----------+-----+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+----------------------+-------------+

| QUERY_ID | SEQ | STATE | DURATION | CPU_USER | CPU_SYSTEM | CONTEXT_VOLUNTARY | CONTEXT_INVOLUNTARY | BLOCK_OPS_IN | BLOCK_OPS_OUT | MESSAGES_SENT | MESSAGES_RECEIVED | PAGE_FAULTS_MAJOR | PAGE_FAULTS_MINOR | SWAPS | SOURCE_FUNCTION | SOURCE_FILE | SOURCE_LINE |

+----------+-----+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+----------------------+-------------+

| 1 | 2 | starting | 0.000116 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |

| 1 | 3 | checking permissions | 0.000007 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | check_access | sql_authorization.cc | 2203 |

| 1 | 4 | Opening tables | 0.000013 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | open_tables | sql_base.cc | 5590 |

| 1 | 5 | init | 0.000005 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Sql_cmd_dml::execute | sql_select.cc | 662 |

| 1 | 6 | optimizing | 0.000008 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | JOIN::optimize | sql_optimizer.cc | 217 |

| 1 | 7 | executing | 0.000051 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | JOIN::exec | sql_executor.cc | 227 |

| 1 | 8 | end | 0.000004 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Sql_cmd_dml::execute | sql_select.cc | 715 |

| 1 | 9 | query end | 0.000005 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | mysql_execute_command | sql_parse.cc | 4547 |

| 1 | 10 | closing tables | 0.000002 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | mysql_execute_command | sql_parse.cc | 4593 |

| 1 | 11 | freeing items | 0.000043 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | mysql_parse | sql_parse.cc | 5264 |

| 1 | 12 | cleaning up | 0.000186 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | dispatch_command | sql_parse.cc | 2159 |

| 2 | 2 | starting | 0.000130 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |

| 2 | 3 | checking permissions | 0.000011 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | check_access | sql_authorization.cc | 2203 |

| 2 | 4 | Opening tables | 0.000023 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | open_tables | sql_base.cc | 5590 |

| 2 | 5 | init | 0.000009 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Sql_cmd_dml::execute | sql_select.cc | 662 |

| 2 | 6 | optimizing | 0.000009 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | JOIN::optimize | sql_optimizer.cc | 217 |

| 2 | 7 | executing | 0.000012 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | JOIN::exec | sql_executor.cc | 227 |

| 2 | 8 | end | 0.000004 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Sql_cmd_dml::execute | sql_select.cc | 715 |

| 2 | 9 | query end | 0.000006 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | mysql_execute_command | sql_parse.cc | 4547 |

| 2 | 10 | closing tables | 0.000094 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | mysql_execute_command | sql_parse.cc | 4593 |

| 2 | 11 | freeing items | 0.000112 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | mysql_parse | sql_parse.cc | 5264 |

| 2 | 12 | cleaning up | 0.000019 | 0.000000 | 0.000000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | dispatch_command | sql_parse.cc | 2159 |

+----------+-----+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+----------------------+-------------+

22 rows in set, 1 warning (0.00 sec)

(6)SHOW STATUS

SHOW STATUS 命令可以查看计数器统计到的值,如统计了查询的次数、使用某个索引的次数。虽然无法展示使用时间,但还是可以通过观察哪些操作执行的更频繁。最有用的计数器有:句柄计数器(handler counter)、临时文件和表计数器等。

mysql> SHOW STATUS WHERE VARIABLE_NAME LIKE 'Handler%' OR VARIABLE_NAME LIKE 'Created%';

+----------------------------+-------+

| Variable_name | Value |

+----------------------------+-------+

| Created_tmp_disk_tables | 0 |

| Created_tmp_files | 5 |

| Created_tmp_tables | 3 |

| Handler_commit | 3 |

| Handler_delete | 0 |

| Handler_discover | 0 |

| Handler_external_lock | 90 |

| Handler_mrr_init | 0 |

| Handler_prepare | 0 |

| Handler_read_first | 0 |

| Handler_read_key | 3 |

| Handler_read_last | 0 |

| Handler_read_next | 0 |

| Handler_read_prev | 0 |

| Handler_read_rnd | 0 |

| Handler_read_rnd_next | 58 |

| Handler_rollback | 0 |

| Handler_savepoint | 0 |

| Handler_savepoint_rollback | 0 |

| Handler_update | 0 |

| Handler_write | 55 |

+----------------------------+-------+

21 rows in set (0.00 sec)

FLASH STATUS; -- 该命令作用是重置计数器

通过重置计数器,并测试一条SQL,就可以获取这条SQL的执行时各个计数器的值。EXPLAIN 得到的是估计的结果,而通过 SHOW STATUS 统计计数器的值测量到的是实际发生的结果。

(7)间歇性问题

举例:一个SQL查询正常情况下很快,但是有几次不合理的特别慢,手工执行下也很快,EXPLAIN 和 SHOW STATUS 中都正确使用了索引,尝试修改WHERE 条件排除缓存命中的可能,也没有什么问题,这种情况下很难查出来是什么原因导致这几次SQL执行很慢,可能是正在备份,或某种类型的锁,或争用阻塞了SQL的进度等,这种问题就是间歇性问题。书中对间歇性问题的建议是不要花费太多时间去找出问题所在,更不能用试错的方式来解决问题,可以通过以下思路进行尝试:

先确定到底是服务器问题还是单条SQL的问题

使用SHOW GLOBAL STATUS

使用SHOW PROCESSLIST

使用慢查询日志

以上两个方法都是通过不停的捕获命令的输出,观察异常值等其他特征,来进行诊断。第三个方法是查看慢查询日志中吞吐量突然下降时间段结束后的那一部分日志,再具体分析哪个SQL导致缓慢。以上三个方法在书中都有具体例子,有需要可以自行看书。书中建议从第1、2两种方法开始查找问题,这两个方法开销最低。

有必要再捕获诊断数据

触发器:根据实际情况设计触发指标和触发条件,使用合理工具(如pt-talk和pt-collect)收集数据给触发器去判断。

(8)一个诊断案例

略,有需要可以自行看书。

(9)使用information_schema

稍后整理一个information_schema库的专题讲解。

mysql高性能学习笔记03_《高性能MySQL》学习笔记——第三章 服务器性能剖析相关推荐

  1. 《高性能MySQL》 第三章 服务器性能剖析 读书笔记

    性能优化 基于响应时间 性能剖析 测量任务所花费的时间 对结果进行统计和排序,将重要的任务排到前面 时间分类 执行时间 等待时间 理解性能剖析 值得优化的查询 一些只占总响应时间比重很小的査询是不值得 ...

  2. 高质量解读《高性能mysql》——第3章服务器性能剖析

    前言: 高效读书,一张逻辑图带你读懂.读薄书中重点. 深入学习MySQL系列,解读的目的是为了把书读薄,抽出重点进行梳理.理解.运用.因大量文字很容易让人觉得枯燥无味,为此博主花费一定精力和时间整理输 ...

  3. 《高性能MySQL》——服务器性能剖析(笔记)

    文章目录 三.服务器性能剖析 3.1 性能优化简介 3.1.1 通过性能剖析进行优化 3.1.2 理解性能剖析 3.2 对应用程序进行性能剖析 3.3 剖析MySQL查询 3.3.1 剖析服务器负载 ...

  4. 高可用高性能负载均衡软件HAproxy详解指南-第三章:HAproxy实例

    目录 haproxy案例1:定义独立日志文件 haproxy案例2:haproxy统计页面的输出机制 haproxy案例3:动静分离示例: haproxy案例4:实现web负载 haproxy案例5: ...

  5. 性能服务器解读,【MySQL数据库】第三章解读:服务器性能剖析(上)

    前言: 保持空杯精神,使用性能剖析,专注于测量服务器的时间花费在哪里,思考1.如何确认服务器是否达到了性能最佳状态,2.某条语句为什么不够快,诊断被用户描述为"停顿.堆积.卡死"的 ...

  6. 读书笔记——《深入理解计算机系统》第三章_程序的机器级表示(一)

    前言:已经大四,没有去找工作,选择了保研,之所以这样选择,有三个原因,一.刚进校时,听说保研都是牛人才能行的事,所以一心努力保研:二.2008年开始,经济危机比较严重,工作不好找,虽然软件专业要找一份 ...

  7. mysql服务器性能剖析,高性能MySQL–服务器性能剖析

    性能剖析一般有两个步骤:测量任务所花费的时间;然后对结果进行统计和排序,将重要的任务排到前面.无法测量就无法有效的优化.完成一项任务所需要的时候可以分为两部分:执行时间和等待时间. 当一个资源变得效率 ...

  8. mysql 性能剖析_MySQL服务器性能剖析(一)

    首先我们来说说性能是什么?性能,为完成某种任务所需要的时间度量,即响应时间. 性能优化的大致思路:首先使用将所有的查询记录到日志中,然后使用pt-query-digest工具生成系统级别的剖析报告,然 ...

  9. mysql第3章数据定义_【MySQL数据库】第3章解读:服务器性能剖析 (下)

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  10. mysql查询18至28岁的人,MariaDB第三章(select)基本查询

    查询基本使用(条件,排序,聚合函数,分组,分页) --创建学生表 create table students ( id int unsigned not null auto_increment pri ...

最新文章

  1. 海思芯片固件修改工具_地平线X3开发板开箱、固件刷写、环境配置
  2. Word转PDF及SWF在线浏览——Flash Paper
  3. W5100使用中的常见问题
  4. CTF中智能合约部署交互基础
  5. 李宏毅机器学习(四)Spatial Transformer Layer
  6. hbase 修改表名_hbase修改表名 - 张欢19933的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. npm install 本地安装与全局安装
  8. MySQL学习(三、分组查询和多表查询)
  9. 毕设题目:Matlab语音隐写
  10. python下载付费音乐包_python无损音乐下载器下载
  11. app版windows95
  12. 机器学习 | 特征选择(Feature Selection)
  13. 详解电脑机械硬盘装什么系统好
  14. JS中flag使用场景之一
  15. [译]第一章:什么是管理
  16. 【SDCC 2016现场】数据库/大数据技术实战专场实录(下)
  17. MySQL 是如何保证一致性、原子性和持久性的!
  18. VS关闭vue语法检测
  19. linux 下DSP音频处理
  20. 按键触发快捷怼人小工具(怼人必备良药)

热门文章

  1. 2d isometric 坐标变换
  2. JJavaBean中使用JDBC方式进行事务处理
  3. vue2项目中全局引入scss变量
  4. uniapp实现滑动导航
  5. 模板引擎-2-模板引擎提供的模板语法
  6. 第一台计算机 采用工 作原理,第1讲计算机工作原理模版课件.ppt
  7. echarts 动态设置y轴单位_Recharts动态设置y轴的最大值最小值
  8. python3file函数_Python3 File(文件) 方法
  9. python遍历目录压缩文件夹_zip包含一个档案文件夹,如何使用Python获取存档中每个zip的注释?...
  10. springboot配置手动提交_Spring Boot 入门教程 | 图文讲解