Profiling MySQL queries from Performance Schema
转自:http://www.percona.com/blog/2015/04/16/profiling-mysql-queries-from-performance-schema/
When optimizing queries and investigating performance issues, MySQL comes with built in support for profiling queries aka SET profiling = 1; . This is already awesome and simple to use, but why the PERFORMANCE_SCHEMA alternative?
Because profiling will be removed soon (already deprecated on MySQL 5.6 ad 5.7); the built-in profiling capability can only be enabled per session. This means that you cannot capture profiling information for queries running from other connections. If you are using Percona Server, the profiling option for log_slow_verbosity is a nice alternative, unfortunately, not everyone is using Percona Server.
Now, for a quick demo: I execute a simple query and profile it below. Note that all of these commands are executed from a single session to my test instance.
mysql> SHOW PROFILES;
+----------+------------+----------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------------------------+
| 1 | 0.00011150 | SELECT * FROM sysbench.sbtest1 LIMIT 1 |
+----------+------------+----------------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW PROFILE SOURCE FOR QUERY 1;
+----------------------+----------+-----------------------+------------------+-------------+
| Status | Duration | Source_function | Source_file | Source_line |
+----------------------+----------+-----------------------+------------------+-------------+
| starting | 0.000017 | NULL | NULL | NULL |
| checking permissions | 0.000003 | check_access | sql_parse.cc | 5797 |
| Opening tables | 0.000021 | open_tables | sql_base.cc | 5156 |
| init | 0.000009 | mysql_prepare_select | sql_select.cc | 1050 |
| System lock | 0.000005 | mysql_lock_tables | lock.cc | 306 |
| optimizing | 0.000002 | optimize | sql_optimizer.cc | 138 |
| statistics | 0.000006 | optimize | sql_optimizer.cc | 381 |
| preparing | 0.000005 | optimize | sql_optimizer.cc | 504 |
| executing | 0.000001 | exec | sql_executor.cc | 110 |
| Sending data | 0.000025 | exec | sql_executor.cc | 190 |
| end | 0.000002 | mysql_execute_select | sql_select.cc | 1105 |
| query end | 0.000003 | mysql_execute_command | sql_parse.cc | 5465 |
| closing tables | 0.000004 | mysql_execute_command | sql_parse.cc | 5544 |
| freeing items | 0.000005 | mysql_parse | sql_parse.cc | 6969 |
| cleaning up | 0.000006 | dispatch_command | sql_parse.cc | 1874 |
+----------------------+----------+-----------------------+------------------+-------------+
15 rows in set, 1 warning (0.00 sec)
To demonstrate how we can achieve the same with Performance Schema, we first identify our current connection id. In the real world, you might want to get the connection/processlist id of the thread you want to watch i.e. from SHOW PROCESSLIST .
mysql> SELECT THREAD_ID INTO @my_thread_id
-> FROM threads WHERE PROCESSLIST_ID = CONNECTION_ID();
Query OK, 1 row affected (0.00 sec)
Next, we identify the bounding EVENT_IDs for the statement stages. We will look for the statement we wanted to profile using the query below from the events_statements_history_long table. Your LIMIT clause may vary depending on how much queries the server might be getting.
mysql> SELECT THREAD_ID, EVENT_ID, END_EVENT_ID, SQL_TEXT, NESTING_EVENT_ID
-> FROM events_statements_history_long
-> WHERE THREAD_ID = @my_thread_id
-> AND EVENT_NAME = 'statement/sql/select'
-> ORDER BY EVENT_ID DESC LIMIT 3 G
*************************** 1. row ***************************
THREAD_ID: 13848
EVENT_ID: 419
END_EVENT_ID: 434
SQL_TEXT: SELECT THREAD_ID INTO @my_thread_id
FROM threads WHERE PROCESSLIST_ID = CONNECTION_ID()
NESTING_EVENT_ID: NULL
*************************** 2. row ***************************
THREAD_ID: 13848
EVENT_ID: 374
END_EVENT_ID: 392
SQL_TEXT: SELECT * FROM sysbench.sbtest1 LIMIT 1
NESTING_EVENT_ID: NULL
*************************** 3. row ***************************
THREAD_ID: 13848
EVENT_ID: 353
END_EVENT_ID: 364
SQL_TEXT: select @@version_comment limit 1
NESTING_EVENT_ID: NULL
3 rows in set (0.02 sec)
From the results above, we are mostly interested with the EVENT_ID and END_EVENT_ID values from the second row, this will give us the stage events of this particular query from the events_stages_history_long table.
mysql> SELECT EVENT_NAME, SOURCE, (TIMER_END-TIMER_START)/1000000000 as 'DURATION (ms)'
-> FROM events_stages_history_long
-> WHERE THREAD_ID = @my_thread_id AND EVENT_ID BETWEEN 374 AND 392;
+--------------------------------+----------------------+---------------+
| EVENT_NAME | SOURCE | DURATION (ms) |
+--------------------------------+----------------------+---------------+
| stage/sql/init | mysqld.cc:998 | 0.0214 |
| stage/sql/checking permissions | sql_parse.cc:5797 | 0.0023 |
| stage/sql/Opening tables | sql_base.cc:5156 | 0.0205 |
| stage/sql/init | sql_select.cc:1050 | 0.0089 |
| stage/sql/System lock | lock.cc:306 | 0.0047 |
| stage/sql/optimizing | sql_optimizer.cc:138 | 0.0016 |
| stage/sql/statistics | sql_optimizer.cc:381 | 0.0058 |
| stage/sql/preparing | sql_optimizer.cc:504 | 0.0044 |
| stage/sql/executing | sql_executor.cc:110 | 0.0008 |
| stage/sql/Sending data | sql_executor.cc:190 | 0.0251 |
| stage/sql/end | sql_select.cc:1105 | 0.0017 |
| stage/sql/query end | sql_parse.cc:5465 | 0.0031 |
| stage/sql/closing tables | sql_parse.cc:5544 | 0.0037 |
| stage/sql/freeing items | sql_parse.cc:6969 | 0.0056 |
| stage/sql/cleaning up | sql_parse.cc:1874 | 0.0006 |
+--------------------------------+----------------------+---------------+
15 rows in set (0.01 sec)
As you can see the results are pretty close, not exactly the same but close. SHOW PROFILE shows Duration in seconds, while the results above is in milliseconds.
Some limitations to this method though:
- As we’ve seen it takes a few hoops to dish out the information we need. Because we have to identify the statement we have to profile manually, this procedure may not be easy to port into tools like the sys schema or pstop.
- Only possible if Performance Schema is enabled (by default its enabled since MySQL 5.6.6, yay!)
- Does not cover all metrics compared to the native profiling i.e. CONTEXT SWITCHES, BLOCK IO, SWAPS
- Depending on how busy the server you are running the tests, the sizes of the history tables may be too small, as such you either have to increase or loose the history to early i.e. performance_schema_events_stages_history_long_size variable. Using ps_history might help in this case though with a little modification to the queries.
- The resulting Duration per event may vary, I would think this may be due to the additional as described on performance_timers table. In any case we hope to get this cleared up as result when this bug is fixed.
Profiling MySQL queries from Performance Schema的更多相关文章
- MySQL 5.7 Performance Schema 详解
refman mysql 5.7 MySQL Performance Schema 用于监视MySQL服务器,且运行时消耗很少的性能.Performance Schema 收集数据库服务器性能参数, ...
- [MySQL Reference Manual] 23 Performance Schema结构
23 MySQL Performance Schema 23 MySQL Performance Schema 23.1 性能框架快速启动 23.2 性能框架配置 23.2.1 性能框架编译时配置 2 ...
- Mysql之performance Schema
Performance schema是用于监控Mysql执行,具有如下特征: 1.用于在运行时探查Mysql Server的执行过程,是由Performance_schema引擎和 Performan ...
- MySQL调优性能监控之performance schema
一.performance_schema的介绍 performance:性能 schema:图(表)示,以大纲或模型的形式表示计划或理论. MySQL的performance schema 用于监控M ...
- MySQL Performance Schema详解
MySQL的performance schema 用于监控MySQL server在一个较低级别的运行过程中的资源消耗.资源等待等情况. 1 performance schema特点 提供了一种在数据 ...
- 通过performance schema收集慢查询
MySQL5.6起performance schema自动开启,里面涉及记录 statement event的表 mysql> show tables like '%statement%'; + ...
- mysql performance schema的即时诊断工具-邱伟胜
https://github.com/noodba http://www.noodba.com
- 【MySQL】MySQL 5.7 sys Schema
sys库说明:http://dev.mysql.com/doc/refman/5.7/en/sys-schema-usage.html sys库使用说明:http://dev.mysql.com/do ...
- MySql(九):MySQL性能调优——Schema设计的性能优化
一.高效的模型设计 先了解下数据库设计的三大范式 第一范式:要求有主键,并且要求每一个字段原子性不可再分 第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖 第三范式:所有非主键字段和主键字段 ...
随机推荐
- UWP开发入门(十六)——常见的内存泄漏的原因
本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...
- 更加优雅地搭建SSH框架(使用java配置)
时代在不断进步,大量基于xml的配置所带来的弊端也显而易见,在XML配置和直接注解式配置之外还有一种有趣的选择方式-JavaConfig,它是在Spring 3.0开始从一个独立的项目并入到Sprin ...
- 【转】Bloom Filter布隆过滤器的概念和原理
转自:http://blog.csdn.net/jiaomeng/article/details/1495500 之前看数学之美丽,里面有提到布隆过滤器的过滤垃圾邮件,感觉到何其的牛,竟然有这么高效的 ...
- ThroughRain学期冲刺总结
团队名:ThroughRain 项目确定:<餐厅到店点餐系统> 项目背景:本次项目是专门为餐厅开发的一套订餐系统.大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座 ...
- Tesseract-OCR引擎 入门
OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程. Tesseract:开源的OCR识别引擎,初期Tesseract引 ...
- LeetCode128:Longest Consecutive Sequence
题目: Given an unsorted array of integers, find the length of the longest consecutive elements sequenc ...
- eclipse中的web项目路径和发布好的项目路径
现在企业开发中,我们都会创建一个javaWeb工程,在eclipse中指的是新建一个dynamic web project,创建完工程之后,我们在IDE中大体看到如下的工程目录: 我们主要关心的文件夹 ...
- 如何给span设置高度宽度?
内容提要:给Span设置高度和宽度后没有作用.本文介绍了如何如何给span设置高度宽度. CSS模型中经常用的容器是DIV和span. 给Span设置高度和宽度后没有作用. <style typ ...
- winform(无边框窗体与timer)
一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要放置的控件可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入(pictureBox1_MouseE ...
- XML的约束(dtd)
DTD(Document Type Definition),文档类型定义,DTD文件应使用UTF-8或Unicode 1.XML中有多少个元素,就在dtd文件中写几个 <!ELEMENT&g ...