MySQL中使用SHOW PROFILE命令分析性能的用法整理
show profile是由Jeremy Cole捐献给MySQL社区版本的。默认的是关闭的,但是会话级别可以开启这个功能。开启它可以让MySQL收集在执行语句的时候所使用的资源。为了统计报表,把profiling设为1
mysql> SET profiling = 1;
之后在运行一个查询
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进行查看。
mysql> SHOW PROFILES/G
*************************** 1. row ***************************Query_ID: 1Duration: 0.02596900Query: SELECT COUNT(DISTINCT actor.first_name) AS cnt_name,...
你可以使用SHOW PROFILE语句来获取已经存储的剖析数据。如果不加参数,会显示状态以及它们持续的时间。
mysql> SHOW PROFILE;
+------------------------+-----------+| 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使用。可以用如下命令。
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。
例如:
mysql> show profiles;
+----------+-------------+---------------------------------------+| 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)
mysql> SHOW PROFILE FOR QUERY 2; #查看alter table table1 drop column c3的分析
+------------------------------+-----------+| 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的次数
例:
mysql> show profile cpu for query 2;
+------------------------------+-----------+----------+------------+| 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分析查询缓存命中的性能优势。
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select count(1) as cnt from tran_excution;
+-------+| cnt |+-------+| 14225 |+-------+1 row in set (0.00 sec)
由于已经启用了查询缓存,相同查询(非分区表)可以直接在查询缓存中命中。
mysql> select count(1) as cnt from tran_excution;
我们仔细看下两个同样的语句的分析。
mysql> show profile source for query 1;
+--------------------------------+----------+-----------------------+---------------+-------------+| 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)
mysql> show profile source for query 2;
+--------------------------------+----------+-----------------------+--------------+-------------+| 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的一个应用示例。
相关文章
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
- C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
- grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24- 这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
- 基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
- MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
- 本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
- 前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08