MySQL中使用SHOW PROFILE命令分析性能的用法整理
show profile是由Jeremy Cole捐献给MySQL社区版本的。默认的是关闭的,但是会话级别可以开启这个功能。开启它可以让MySQL收集在执行语句的时候所使用的资源。为了统计报表,把profiling设为1
|
1
|
mysql> SET profiling = 1; |
之后在运行一个查询
|
1
2
3
4
5
6
7
|
mysql> SELECT COUNT(DISTINCT actor.first_name) AS cnt_name, COUNT(*) AS cnt-> FROM sakila.film_actor-> INNER JOIN sakila.actor USING(actor_id)-> GROUP BY sakila.film_actor.film_id-> ORDER BY cnt_name DESC;...997 rows in set (0.03 sec) |
这个执行语句的剖析信息存储在这个会话中。使用SHOW PROFILES进行查看。
|
1
|
mysql> SHOW PROFILES\G |
|
1
2
3
4
|
*************************** 1. row ***************************Query_ID: 1Duration: 0.02596900Query: SELECT COUNT(DISTINCT actor.first_name) AS cnt_name,... |
你可以使用SHOW PROFILE语句来获取已经存储的剖析数据。如果不加参数,会显示状态以及它们持续的时间。
|
1
|
mysql> SHOW PROFILE; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
+------------------------+-----------+| Status | Duration |+------------------------+-----------+| (initialization) | 0.000005 || Opening tables | 0.000033 || System lock | 0.000037 || Table lock | 0.000024 || init | 0.000079 || optimizing | 0.000024 || statistics | 0.000079 || preparing | 0.00003 || Creating tmp table | 0.000124 || executing | 0.000008 || Copying to tmp table | 0.010048 || Creating sort index | 0.004769 || Copying to group table | 0.0084880 || Sorting result | 0.001136 || Sending data | 0.000925 || end | 0.00001 || removing tmp table | 0.00004 || end | 0.000005 || removing tmp table | 0.00001 || end | 0.000011 || query end | 0.00001 || freeing items | 0.000025 || removing tmp table | 0.00001 || freeing items | 0.000016 || closing tables | 0.000017 || logging slow query | 0.000006 |+------------------------+-----------+ |
每行都是状态变化的过程以及它们持续的时间。Status那一列和SHOW FULL PROCESSLIST的State应该是一致的。
这个值是来自于thd->proc_info变量。因此你所查看的这个值是直接来自MySQL内部的。尽管这些数值是比较直接易懂的,你也可以查看MySQL手册。
你可以给SHOW PROFILES指定一个Query_ID来查看指定的语句,还可以给输出添加新的列。如,查看用户和CPU使用。可以用如下命令。
|
1
|
mysql> SHOW PROFILE CPU FOR QUERY 1; |
SHOW PROFILE可以深入的查看服务器执行语句的工作情况。以及也能帮助你理解执行语句消耗时间的情况。一些限制是它没有实现的功能,不能查看和剖析其他连接的语句,以及剖析时所引起的消耗。
SHOW PROFILES显示最近发给服务器的多条语句,条数根据会话变量profiling_history_size定义,默认是15,最大值为100。设为0等价于关闭分析功能。
SHOW PROFILE FOR QUERY n,这里的n就是对应SHOW PROFILES输出中的Query_ID。
例如:
|
1
|
mysql> show profiles; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
+----------+-------------+---------------------------------------+| Query_ID | Duration | Query |+----------+-------------+---------------------------------------+| 1 | 0.00037700 | alter table table1 drop column c3 int || 2 | 70.37123800 | alter table table1 drop column c3 || 3 | 0.00124500 | show tables || 4 | 0.00569800 | select * from table1 where id=2 || 5 | 0.00068500 | select count(1) from tables1 || 6 | 0.00197900 | select count(1) from table1 || 7 | 0.00105900 | alter table tables1 drop c1 || 8 | 0.00800200 | alter table table1 drop c1 |+----------+-------------+---------------------------------------+8 rows in set (0.00 sec) |
|
1
|
mysql> SHOW PROFILE FOR QUERY 2; #查看alter table table1 drop column c3的分析 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
+------------------------------+-----------+| Status | Duration |+------------------------------+-----------+| starting | 0.000183 || checking permissions | 0.000057 || checking permissions | 0.000059 || init | 0.000060 || Opening tables | 0.000071 || System lock | 0.000062 || setup | 0.000080 || creating table | 0.005052 || After create | 0.000220 || copy to tmp table | 0.000244 || rename result table | 70.364027 || end | 0.000575 || Waiting for query cache lock | 0.000062 || end | 0.000075 || query end | 0.000057 || closing tables | 0.000061 || freeing items | 0.000080 || logging slow query | 0.000056 || logging slow query | 0.000098 || cleaning up | 0.000059 |+------------------------------+-----------+20 rows in set (0.00 sec) |
如果没有指定FOR QUERY,那么输出最近一条语句的信息。
LIMIT部分的用法与SELECT中LIMIT子句一致,不赘述。
type是可选的,取值范围可以如下:
- ALL 显示所有性能信息
- BLOCK IO 显示块IO操作的次数
- CONTEXT SWITCHES 显示上下文切换次数,不管是主动还是被动
- CPU 显示用户CPU时间、系统CPU时间
- IPC 显示发送和接收的消息数量
- MEMORY [暂未实现]
- PAGE FAULTS 显示页错误数量
- SOURCE 显示源码中的函数名称与位置
- SWAPS 显示SWAP的次数
例:
|
1
|
mysql> show profile cpu for query 2; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
+------------------------------+-----------+----------+------------+| Status | Duration | CPU_user | CPU_system |+------------------------------+-----------+----------+------------+| starting | 0.000183 | 0.000000 | 0.000000 || checking permissions | 0.000057 | 0.000000 | 0.000000 || checking permissions | 0.000059 | 0.000000 | 0.000000 || init | 0.000060 | 0.000000 | 0.000000 || Opening tables | 0.000071 | 0.000000 | 0.000000 || System lock | 0.000062 | 0.000000 | 0.000000 || setup | 0.000080 | 0.000000 | 0.001000 || creating table | 0.005052 | 0.003000 | 0.001000 || After create | 0.000220 | 0.000000 | 0.000000 || copy to tmp table | 0.000244 | 0.000000 | 0.000000 || rename result table | 70.364027 | 7.470864 | 41.612674 || end | 0.000575 | 0.000000 | 0.001000 || Waiting for query cache lock | 0.000062 | 0.000000 | 0.000000 || end | 0.000075 | 0.000000 | 0.000000 || query end | 0.000057 | 0.000000 | 0.000000 || closing tables | 0.000061 | 0.000000 | 0.000000 || freeing items | 0.000080 | 0.000000 | 0.000000 || logging slow query | 0.000056 | 0.000000 | 0.000000 || logging slow query | 0.000098 | 0.000000 | 0.000000 || cleaning up | 0.000059 | 0.000000 | 0.000000 |+------------------------------+-----------+----------+------------+20 rows in set (0.00 sec) |
ps:
SHOW PROFILE ALL FOR QUERY 2;的信息还可以通过SELECT * FROM information_schema.profiling WHERE query_id = 2 ORDER BY seq;获取。
作用范围
这个命令只是在本会话内起作用,即无法分析本会话外的语句。
开启分析功能后,所有本会话中的语句都被分析(甚至包括执行错误的语句),除了SHOW PROFILE和SHOW PROFILES两句本身。
应用示例:使用SHOW PROFILE分析查询缓存命中的性能优势。
|
1
|
mysql> set profiling=1; |
|
1
|
Query OK, 0 rows affected (0.00 sec) |
|
1
|
mysql> select count(1) as cnt from tran_excution; |
|
1
2
3
4
5
6
|
+-------+| cnt |+-------+| 14225 |+-------+1 row in set (0.00 sec) |
由于已经启用了查询缓存,相同查询(非分区表)可以直接在查询缓存中命中。
|
1
|
mysql> select count(1) as cnt from tran_excution; |
我们仔细看下两个同样的语句的分析。
|
1
|
mysql> show profile source for query 1; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
+--------------------------------+----------+-----------------------+---------------+-------------+| Status | Duration | Source_function | Source_file | Source_line |+--------------------------------+----------+-----------------------+---------------+-------------+| starting | 0.000048 | NULL | NULL | NULL || Waiting for query cache lock | 0.000013 | try_lock | sql_cache.cc | 454 || checking query cache for query | 0.000040 | send_result_to_client | sql_cache.cc | 1561 || checking permissions | 0.000023 | check_access | sql_parse.cc | 4751 || Opening tables | 0.000040 | open_tables | sql_base.cc | 4831 || System lock | 0.000020 | mysql_lock_tables | lock.cc | 299 || Waiting for query cache lock | 0.000037 | try_lock | sql_cache.cc | 454 || init | 0.000020 | mysql_select | sql_select.cc | 2579 || optimizing | 0.000015 | optimize | sql_select.cc | 865 || statistics | 0.000017 | optimize | sql_select.cc | 1056 || preparing | 0.000016 | optimize | sql_select.cc | 1078 || executing | 0.000015 | exec | sql_select.cc | 1836 || Sending data | 0.003875 | exec | sql_select.cc | 2380 || end | 0.000018 | mysql_select | sql_select.cc | 2615 || query end | 0.000015 | mysql_execute_command | sql_parse.cc | 4440 || closing tables | 0.000016 | mysql_execute_command | sql_parse.cc | 4492 || freeing items | 0.000016 | mysql_parse | sql_parse.cc | 5640 || Waiting for query cache lock | 0.000012 | try_lock | sql_cache.cc | 454 || freeing items | 0.000032 | NULL | NULL | NULL || Waiting for query cache lock | 0.000017 | try_lock | sql_cache.cc | 454 || freeing items | 0.000016 | NULL | NULL | NULL || storing result in query cache | 0.000017 | end_of_result | sql_cache.cc | 1020 || logging slow query | 0.000018 | log_slow_statement | sql_parse.cc | 1461 || logging slow query | 0.000050 | log_slow_statement | sql_parse.cc | 1470 || cleaning up | 0.000018 | dispatch_command | sql_parse.cc | 1417 |+--------------------------------+----------+-----------------------+---------------+-------------+25 rows in set (0.00 sec) |
|
1
|
mysql> show profile source for query 2; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
+--------------------------------+----------+-----------------------+--------------+-------------+| Status | Duration | Source_function | Source_file | Source_line |+--------------------------------+----------+-----------------------+--------------+-------------+| starting | 0.000051 | NULL | NULL | NULL || Waiting for query cache lock | 0.000014 | try_lock | sql_cache.cc | 454 || checking query cache for query | 0.000016 | send_result_to_client | sql_cache.cc | 1561 || checking privileges on cached | 0.000013 | send_result_to_client | sql_cache.cc | 1652 || checking permissions | 0.000015 | check_access | sql_parse.cc | 4751 || sending cached result to clien | 0.000036 | send_result_to_client | sql_cache.cc | 1749 || logging slow query | 0.000017 | log_slow_statement | sql_parse.cc | 1461 || cleaning up | 0.000018 | dispatch_command | sql_parse.cc | 1417 |+--------------------------------+----------+-----------------------+--------------+-------------+8 rows in set (0.00 sec) |
可以清晰地看到缓存中命中时,大大节省了后台的开销。当然缓存的使用也需要根据各种场景(表的数据规模,更新频率等)考察使用,并不是启用缓存就一定能够提高查询效率。这里仅仅作为SHOW PROFILE的一个应用示例。
MySQL中使用SHOW PROFILE命令分析性能的用法整理的更多相关文章
- MySQL中使用SHOW PROFILE命令分析性能的用法整理(配合explain效果更好,可以作为优化周期性检查)
这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下 show profile是由Jerem ...
- 006-MySQL中使用SHOW PROFILE命令分析性能
一.概述 1.版本支持 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. 查看数据库版本: Select version(); 2.查看开启关闭和默认 ...
- 一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.简述MySQL中索引类型对数据库的性能的影响 2.RDB和AOF机制 3.Redis的过期键的删除策略 4.Redis ...
- Mysql 中完善的帮助命令
Mysql 中完善的帮助命令 Mysql 中的帮助系统很完善,很多操作都可以通过命令行直接获得帮助,如下示例: Mysql 命令行帮助 [root@mysql1 mydata1]# mysql -S ...
- MySQL中 IFNULL、NULLIF和ISNULL函数的用法
mysql 中 ifnull().nullif().isnull()函数的用法讲解: 一.IFNULL(expr1,expr2)用法: 假如expr1不为NULL,则 IFNULL() 的返回值为ex ...
- MySQL中的binlog相关命令和恢复技巧
操作命令: 复制代码 代码如下: show binlog events in 'mysql-bin.000016' limit 10; reset master 删除所有的二进制日志 flush lo ...
- MySQL中MyISAM引擎与InnoDB引擎性能简单测试
[硬件配置]CPU : AMD2500+ (1.8G)内存: 1G/现代硬盘: 80G/IDE[软件配置]OS : Windows XP SP2SE : PHP5.2.1DB : MySQL5.0.3 ...
- mysql中日志的配置与分析
默认情况下,如果日志没有配置,则只记录错误日志,记录到syslog,配置文件 /etc/mysql/conf.d/mysqld_safe_syslog.cnf (ubuntu下) [mysqld_sa ...
- 【MySQL】MySQL中where条件的执行分析
1.问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检 ...
随机推荐
- hdu 1540 线段树
这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
- JS函数入门
一. 函数的声明及调用 * 1函数的格式:function 函数名(参数1,参数2......){ * //函数体 * return 结果: * * } * 函数调用的格式: * 直接调用:函数名(参 ...
- vue初学:基础概念
一.vue使用步骤: 1.引包vue.js 2.html中写要操作的DOM节点 3.创建vue对象:new Vue({options}); 4.配置options:el:(要操作的对象,用选择器,同j ...
- PAT L3-010 是否完全二叉搜索树(二叉搜索树)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
- selenium学习一
chrome版本和chromedriver的对应关系 chromedriver版本 支持的Chrome版本 v2.40 v66-68 v2.39 v66-68 v2.38 v65-67 v2.37 v ...
- Django具体操作(四)
自定义模板语法的标签 首先在django的项目中创建app并且在settings中添加了APP的名称. 在app添加templatetags模块(名字是固定的,也就是说,必须要这样) 如图如何自定义呢 ...
- 纯java+maven+sqlserver使用mybatis
第一部分:基本实现 @参考文章,在此基础上略作修改 1,新建maven项目JavaMybatis导入依赖 <dependencies> <dependency> <gro ...
- c++ 中map 的find 函数用法
Map中,find函数用来定位数据出现位置,当含有该数据,即查找成功时,返回数据所在未知的迭代器, 如果查找失败,则返回end()函数所在的迭代器,因此用是否等于end来判断是否查找成功. 程序示例: ...
- 音频 PCM 数据的采集和播放
PCM(Pulse Code Modulation)脉冲编码调制 —— 音频的采集与量化过程. PCM数据是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但体积庞大. 为了解决这个问题先后诞生了 ...
- 【RabbitMQ】——5种队列(转)
原文地址:https://blog.csdn.net/u012654963/article/details/76417613 应用RabbitMQ,我们可以根据需求选择5种队列之一. 一.简单队列 P ...