Performance Schema使用简介(一)
Performance Schema简介
Oracle DBA都应该知道 Oracle中提供了大量的视图供DBA们排查问题使用,并且有等待事件帮助大家快速定位问题属于哪一类。MySQL 中也有Performance Schema帮助大家去分析排查问题,并且在5.7中增加了Sys Schema,将Performance Schema和information_schema的信息格式化后,供大家更方便的分析问题。
这里先介绍先Performance Schema的使用方式,便于后面大家更好的去使用Sys Schema。
Performance Schema开启方式
- 开启Performance Schema库
在配置文件中添加performance_schema=on
- 设置instruments及consumers开启
开启performance_schema=on之后我们还需要进行设置instruments及consumers
instruments通俗讲就是监控项可以通过setup_instruments表设置需要开启对哪些项监控进行统计
consumers就是控制是否将监控到的结果进行记录
UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
UPDATE setup_consumers SET ENABLED = 'YES';
如果不开启instruments和consumers则相应的事件检测则不能使用,也就不能收集相应的等待事件和性能的统计。
当然我们也可以单独设置某一个instruments的开启和关闭
UPDATE setup_instruments SET ENABLED = 'NO'
WHERE NAME = 'wait/io/file/sql/binlog';
为了防止重启后恢复默认配置可以添加到配置文件中设置
performance-schema-instrument='instrument_name=value'
performance-schema-consumer-consumer_name=value
instrument_name和consumer_name
可以通过查询setup_instruments和setup_consumers;查看
setup_consumers中的层级关系
mysql> select * from setup_consumers;
+--------------------------------+---------+
| NAME | ENABLED |
+--------------------------------+---------+
| events_stages_current | YES |
| events_stages_history | YES |
| events_stages_history_long | YES |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | YES |
| events_waits_current | YES |
| events_waits_history | YES |
| events_waits_history_long | YES |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+--------------------------------+---------+
12 rows in set (0.00 sec)
setup_consumers中的事件表有层级之分 ,我们可以通过上面看到有 global、thread、current、history、history_long,他们之间的层级如下:
global_instrumentation
thread_instrumentation
events_waits_current
events_waits_history
events_waits_history_long
events_stages_current
events_stages_history
events_stages_history_long
events_statements_current
events_statements_history
events_statements_history_long
statements_digest
也就是说,如果设置了global的才会去检查thread的有没有被设置,如果thread的设置了才会去检查current的有没有被设置,如果global的没有被设置则thread和current都不去检查,相应的信息也不会记录到对应的表中。
如果global_instrumentation没有被设置则对应的表中都不会记录任何信息。
这里的history、history_long可以通过参数设置大小,因为是内存表,如果太大会占用很多内存。
setup_instruments中的类型
mysql> select name,count(*) from setup_instruments group by left(name,5);
+---------------------------------+----------+
| name | count(*) |
+---------------------------------+----------+
| idle | 1 |
| stage/sql/After create | 108 |
| statement/sql/select | 168 |
| wait/synch/mutex/sql/PAGE::lock | 279 |
+---------------------------------+----------+
4 rows in set (0.00 sec)
我们可以看到setup_instruments中的类型有四种(5.6版本)。
具体的解释大家可以在官网中查看:
https://dev.mysql.com/doc/refman/5.6/en/performance-schema-instrument-naming.html
简单使用介绍
简单介绍几个语句用于排查SQL语句的效率
- 查询没有使用到索引或者索引效率低下的语句:
SELECT OBJECT_SCHEMA, THREAD_ID TID, SUBSTR(SQL_TEXT, 1, 50) SQL_TEXT, ROWS_SENT RS, ROWS_EXAMINED RE,CREATED_TMP_TABLES,NO_INDEX_USED,NO_GOOD_INDEX_USED FROM performance_schema.events_statements_history WHERE (NO_INDEX_USED=1 OR NO_GOOD_INDEX_USED=1) and sql_text NOT LIKE '%performance_schema%'G
- 查看哪些索引没有被使用过
SELECT
OBJECT_SCHEMA,
OBJECT_NAME,
INDEX_NAME
FROM table_io_waits_summary_by_index_usage
WHERE INDEX_NAME IS NOT NULL
AND COUNT_STAR = 0
AND OBJECT_SCHEMA <> 'mysql'
ORDER BY OBJECT_SCHEMA,OBJECT_NAME;
- 查看SQL语句在哪个阶段消耗最大
SELECT eshl.event_name, sql_text, eshl.timer_wait/1000000000000 w_s
FROM performance_schema.events_stages_history_long eshl
JOIN performance_schema.events_statements_history_long esthl
ON (eshl.nesting_event_id = esthl.event_id)
WHERE eshl.timer_wait > 1*10000000000G
总 结
此次简单介绍了Performance Schema的使用,后面会逐步介绍使用Performance Schema的一些实战功能。
- Golang中container/list包中的坑
- 关于Golang语言数组索引的有趣现象
- Golang不定参数
- Go并发编程基础(译)
- go-concurrent-programming.md
- Go语言并发模型:以并行处理MD5为例
- golang 使用json 包 实现序列化
- 【远古文章】用 Go 语言来看 Android! 出发, Android, 出发!
- Leaf 游戏服务器框架简介
- MongoDB 存储过程的使用以及性能调优方案
- [go语言]利用缓冲信道来实现网游帐号验证消息的分发和等待
- 【Golang语言社区--投稿专区】简单,好玩,有趣的命令行版12306(golang)
- 网游内存数据库的设计(1)
- 网游内存数据库的设计(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法