分析SQL执行带来的开销是优化SQL的重要手段。在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory等等。根据这些开销进一步分析当前SQL瓶颈从而进行优化与调整。

注意:MySQL5.0.37版本以上支持PROFILING调试功能,但是因为它需要调用系统的getrusage函数(用于获取进程资源使用量),所以只是在Linux/Unix类平台上才能使用,并且PROFILING是针对处理进程(process)而不是线程(thread)的;服务器上的其他应用,比如说服务器负载不同,MySQL的响应速度、IO效率等可能不同,从而导致PROFILING结果不同(即便是对同一条SQL语句),因此,这个工具适合开发过程中的调试,如果要在生产环境中调试使用,则要注意它的局限性。

1、获取你的MySQL服务器版本

[shusheng@localhost ~]$ mysql --version
mysql Ver 14.14 Distrib 5.1., for redhat-linux-gnu (i386) using readline 5.1

2、查看profiling系统变量

mysql> show variables like '%profil%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| have_profiling | YES | --只读变量,用于控制是否由系统变量开启或禁用profiling(我还不确定这项是否只出现特定版本或者需要设置)
| profiling | OFF | --开启SQL语句剖析功能(开启之后应为ON)
| profiling_history_size | | --设置保留profiling的数目,缺省为15,范围为0至100,为0时将禁用profiling
+------------------------+-------+

3、来查看是否已经启用profile

mysql> select @@PROFILING;
+-------------+
| @@PROFILING |
+-------------+
| 0 |
+-------------+
1 row in set (0.03 sec)

如果profiling值为0,可以通过

SET profiling = 1;

来启用。启用profiling之后,我们执行一条查询语句,比如:

mysql> SELECT * FROM mysql.user;

然后show profiles查看如下:

mysql> show profiles;
+----------+------------+--------------------------------+
| Query_ID | Duration | Query |
+----------+------------+--------------------------------+
| 1 | 0.00015400 | select @@PROFILING |
| 2 | 0.00160000 | SELECT * FROM mysql.user |
+----------+------------+--------------------------------+
2 rows in set (0.00 sec)

其中ID为2的语句是刚执行的查询语句,profiles文件只会记录当前session并且profile打开之后的SQL语句。

4、获取profile的帮助(常见的参数选项);

mysql> help profile;
Name: 'SHOW PROFILE'
Description:
Syntax:
SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]] type:
| ALL --显示所有的开销信息
| BLOCK IO --显示块IO相关开销
| CONTEXT SWITCHES --上下文切换相关开销
| CPU --显示CPU相关开销信息
| IPC --显示发送和接收相关开销信息
| MEMORY --显示内存相关开销信息
| PAGE FAULTS --显示页面错误相关开销信息
| SOURCE --显示和Source_function,Source_file,Source_line相关的开销信息
| SWAPS --显示交换次数相关开销的信息 注意:上面的的命令help命令,在你的系统里显示出来的结果不一定和上面相同,可能是版本的原因,不必深究。

5、利用profile获取SQL语句的开销信息

注意:

(1)show profile之类的语句不会被profiling,即自身不会产生Profiling 
(2)变量profiling是用户变量,每次都得重新启用(session退出之后,profiling会被自动关闭 )。
下面是profile的常用功能:

登陆到数据库(schema)
mysql> use test
Database changed 开启profile
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

现在开始执行需要测试的SQL语句,MySQL数据库将会记录想关的调试信息

mysql> SHOW TABLES;
+----------------------+
| Tables_in_test |
+----------------------+
| account |
| branch |
+----------------------+
2 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM account;
+----------+
| COUNT(*) |
+----------+
| 24 |
+----------+
1 row in set (0.00 sec)

显示当前所有已经记录的PROFILES:

mysql> SHOW PROFILES;
+----------+------------+------------------------------+
| Query_ID | Duration | Query |
+----------+------------+------------------------------+
| 1 | 0.00100800 | SHOW TABLES |
| 2 | 0.00021700 | SELECT COUNT(*) FROM account |
+----------+------------+------------------------------+
2 rows in set (0.00 sec)

获取指定查询的开销,对应上面profiles中的Query_ID:
mysql> SHOW PROFILE FOR QUERY ;
+--------------------+----------+
| Status | Duration |
+--------------------+----------+
| starting | 0.000078 |
| Opening tables | 0.000031 |
| System lock | 0.000015 |
| Table lock | 0.000010 |
| init | 0.000012 |
| optimizing | 0.000019 |
| executing | 0.000022 |
| end | 0.000006 |
| query end | 0.000003 |
| freeing items | 0.000014 |
| logging slow query | 0.000003 |
| cleaning up | 0.000004 |
+--------------------+----------+
rows in set (0.00 sec)
其他的一些具体的参数:
mysql> SHOW PROFILE BLOCK IO, CPU FOR QUERY ;
+--------------------+----------+----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------+----------+----------+------------+--------------+---------------+
| starting | 0.000078 | 0.000000 | 0.000000 | | |
| Opening tables | 0.000031 | 0.000000 | 0.000000 | | |
| System lock | 0.000015 | 0.000000 | 0.000000 | | |
| Table lock | 0.000010 | 0.000000 | 0.000000 | | |
| init | 0.000012 | 0.000000 | 0.000000 | | |
| optimizing | 0.000019 | 0.000000 | 0.000000 | | |
| executing | 0.000022 | 0.000000 | 0.000000 | | |
| end | 0.000006 | 0.000000 | 0.000000 | | |
| query end | 0.000003 | 0.000000 | 0.000000 | | |
| freeing items | 0.000014 | 0.000000 | 0.000000 | | |
| logging slow query | 0.000003 | 0.000000 | 0.000000 | | |
| cleaning up | 0.000004 | 0.000000 | 0.000000 | | |
+--------------------+----------+----------+------------+--------------+---------------+
rows in set (0.00 sec)
下面的SQL语句用于查询query_id为2的SQL开销,且按最大耗用时间倒序排列  
mysql> set @query_id=2; 
 
mysql> SELECT STATE, SUM(DURATION) AS Total_R, 
    ->   ROUND( 
    ->        100 * SUM(DURATION) / 
    ->           (SELECT SUM(DURATION) 
    ->            FROM INFORMATION_SCHEMA.PROFILING 
    ->            WHERE QUERY_ID = @query_id 
    ->        ), 2) AS Pct_R, 
    ->     COUNT(*) AS Calls, 
    ->     SUM(DURATION) / COUNT(*) AS "R/Call" 
    ->  FROM INFORMATION_SCHEMA.PROFILING 
    ->  WHERE QUERY_ID = @query_id 
    ->  GROUP BY STATE 
    ->  ORDER BY Total_R DESC;  

结果如下:

+--------------------+----------+-------+-------+--------------+
| STATE | Total_R | Pct_R | Calls | R/Call |
+--------------------+----------+-------+-------+--------------+
| starting | 0.000078 | 35.94 | | 0.0000780000 |
| Opening tables | 0.000031 | 14.29 | | 0.0000310000 |
| executing | 0.000022 | 10.14 | | 0.0000220000 |
| optimizing | 0.000019 | 8.76 | | 0.0000190000 |
| System lock | 0.000015 | 6.91 | | 0.0000150000 |
| freeing items | 0.000014 | 6.45 | | 0.0000140000 |
| init | 0.000012 | 5.53 | | 0.0000120000 |
| Table lock | 0.000010 | 4.61 | | 0.0000100000 |
| end | 0.000006 | 2.76 | | 0.0000060000 |
| cleaning up | 0.000004 | 1.84 | | 0.0000040000 |
| query end | 0.000003 | 1.38 | | 0.0000030000 |
| logging slow query | 0.000003 | 1.38 | | 0.0000030000 |
+--------------------+----------+-------+-------+--------------+
rows in set (0.03 sec)
开启profiling后,我们可以通过show profile等方式查看,其实质是这些开销信息被记录到information_schema.profiling表  
如下面的查询,部分信息省略 
mysql> SELECT * FROM INFORMATION_SCHEMA.PROFILING LIMIT ,\G;
*************************** . row ***************************
QUERY_ID:
SEQ:
STATE: System lock
DURATION: 0.000004
CPU_USER: 0.000000
CPU_SYSTEM: 0.000000
CONTEXT_VOLUNTARY:
CONTEXT_INVOLUNTARY:
BLOCK_OPS_IN:
BLOCK_OPS_OUT:
MESSAGES_SENT:
MESSAGES_RECEIVED:
PAGE_FAULTS_MAJOR:
PAGE_FAULTS_MINOR:
SWAPS:
SOURCE_FUNCTION: unknown function
SOURCE_FILE: lock.cc
SOURCE_LINE:
停止profile,可以设置profiling参数,或者在session退出之后,profiling会被自动关闭 

mysql> set profiling=off; 
Query OK, 0 rows
affected, 1 warning (0.00 sec)      

现在我也只是具体用了这么点,在具体生产环境里,怎么利用它来优化MySQL(SQL执行)、找出具体的SQL优化方案,有待进一步学习。

MySQL优化之profile的更多相关文章

  1. Mysql优化--Show Profile

    Mysql 系列文章主页 =============== 是Mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于Sql的调优的测量.默认情况下处于关闭状态,并保存最近 15 次的运行结 ...

  2. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  3. PHP中的数据库一、MySQL优化策略综述

    前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...

  4. MySQL优化—工欲善其事,必先利其器之EXPLAIN(转)

    最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下EXPLAIN. 内容导航 id select_t ...

  5. MySQL优化—工欲善其事,必先利其器之EXPLAIN

    最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下EXPLAIN. 内容导航 id select_t ...

  6. Mysql优化相关总结

    Mysql优化相关总结 2016-05-31 数据库集中营 优化顺序: 选择适当的引擎和表结构和数据类型 建立索引,优化sql. 增加缓存,redis.memcache. 主从.主主,读写分离. my ...

  7. mysql优化一之查询优化

    这一篇笔记的mysql优化是注重于查询优化,根据mysql的执行情况,判断mysql什么时候需要优化,关于数据库开始阶段的数据库逻辑.物理结构的设计结构优化不是本文重点,下次再谈 查看mysql语句的 ...

  8. MySQL优化面试

    原则:尽量使用整型表示字符串 存储IP INET_ATON(str),address to number INET_NTOA(number),number to address MySQL内部的枚举类 ...

  9. MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代

    本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情 ...

随机推荐

  1. C语言Windows程序开发—MessageBox函数介绍【第01天】

    (一)MessageBox函数的参数介绍: int MessageBox ( HWND hWnd, //弹出MessageBox对话框所属的窗口句柄 LPCTSTR lpText, //指向Messa ...

  2. 反射vs简单工厂模式

    interface Computer { void printpc(); } class lenovo implements Computer { @Override public void prin ...

  3. Go语言中的变量

    1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内 ...

  4. golang 并发执行函数func类型slice

    golang的slice支持func.使用func slice要注意func要完整描述入参出参. 如果需要执行一系列类型相同(入参出参格式相同)的函数,可以动态添加到一个slice里面.range s ...

  5. [HDU6315]Naive Operations(线段树+树状数组)

    构造一个序列B[i]=-b[i],建一颗线段树,维护区间max, 每次区间加后再询问该区间最大值,如果为0就在树状数组中对应的值+1(该操作可能进行多次) 答案在树状数组中找 其实只用一颗线段树也是可 ...

  6. typescript入门,可以一起探讨提点意见互相学习。

    typescript是js的一个超集,TypeScript扩展了JavaScript的语法,所以任何现有的JavaScript程序可以不加改变的在TypeScript下工作.TypeScript是为大 ...

  7. c++ 面向对象程序设计

    1. OOP:概述 2. 定义基类和派生类 3. 虚函数 4. 抽象基类 5. 访问控制与继承 6. 继承中的类作用域 7. 构造函数与拷贝控制 8. 容器与继承

  8. serv-u自动停止的解决方法

    在主界面serv-u管理控制台-主页--管理服务器----服务器详细信息下,点击“创建,修改并删除服务器事件”找到“事件”右击空白处---“添加”然后如下图所示填写: 点击“保存”就好了,而且我自己也 ...

  9. Restify Api 开发经验

    此文已由作者王振华授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 工作期间,一直在用Restify开发或维护大大小小的API系统,现在分享一下一些个人觉得不错的Tips. 充 ...

  10. 网易七鱼 Android 高性能日志写入方案

    本文来自网易云社区 作者:网易七鱼 Android 开发团队 前言 网易七鱼作为一款企业级智能客服系统,对于系统稳定性要求很高,不过难保用户在使用中不会出现问题,而 Android SDK 安装在用户 ...