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*10000000000\G

总 结

此次简单介绍了Performance Schema的使用,后面会逐步介绍使用Performance Schema的一些实战功能。

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2017-06-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴柯的运维笔记

mysql数据库服务概述

什么是数据库? ? 常见数据库服务软件介绍: ? mysql数据库的特点及应用: ? 数据库基本管理 # mysql -u root -p -h 127.0...

2988
来自专栏挖坑填坑

sql server 表分区

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invi...

901
来自专栏蓝天

MySQL中MyISAM引擎与InnoDB引擎性能简单测试

[硬件配置] CPU : AMD2500+ (1.8G) 内存: 1G/现代 硬盘: 80G/IDE [软件配置] OS : Windows XP SP2 S...

852
来自专栏跟着阿笨一起玩NET

我的MYSQL学习心得(一) 简单语法

使用MYSQL有一段时间了,由于公司使用SQLSERVER和MYSQL,而且服务器数量和数据库数量都比较多

2041
来自专栏杨建荣的学习笔记

两个死锁的实例 (r5笔记第90天)

关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都是一致的。 The f...

3166
来自专栏乐沙弥的世界

MySQL视图

视图是关系型数据库重要的组成部分之一,它可以限制数据访问,简化复杂查询,保持数据的独立性,以及基于相同的数据提供不同的视图等等。本文介绍MySQL数据库视图的一...

882
来自专栏猿人谷

Mysql中DDL, DML, DCL, 和TCL是什么?

在一些公司中提交给测试团队的SQL脚本会划分为DDL、DML等,但这些概念到底是如何定义的呢?

953
来自专栏Python、Flask、Django

自动创建权限表数据和超级管理员用户(第一次优化)

1122
来自专栏杨建荣的学习笔记

有关Oracle role的总结

oracle的role算是对sys privilege 和object privilege的打包。 今天深入的测试了下,还算有不少的东西。 role不是sche...

4106
来自专栏cloudskyme

oracle修改表字段

增加字段     alter   table   docdsp     add   dspcode   char(200)     删除字段     AL...

36610

扫码关注云+社区