performance_schema

performance_schema,顾名思义,用于监控展现mysql实时性能情况的库。主要记录的是server执行某些活动对某些资源的消耗、耗时、这些活动执行的次数等情况。需要注意的是,performance_schema是库名,而不是表名。也就是说,performance_schema库里有各种表来进行各种指标的记录。

特点:

  • 该表的数据只在本地记录,也就是这部分数据不会写到binlog,也不会被复制到从库。
  • 数据仅保存在内存中,不会持久化到磁盘,因此服务器重启这部分数据就会丢失。

Performance Schema 表记录了以下几类信息:

  • SQL 语句执行时间: 记录每个 SQL 语句的执行时间,包括解析、优化、执行等阶段。
  • 线程活动: 记录每个线程的活动状态,例如正在执行的 SQL 语句、等待的锁等。
  • 内存使用: 记录服务器内存的使用情况,包括各种缓存的大小和使用率。
  • IO 操作: 记录服务器的磁盘 IO 操作,例如读取和写入数据的时间。
  • 事件: 记录服务器发生的各种事件,例如连接建立、断开连接、锁获取、释放等。

performance_schema下的表

可以根据监视维度查询具体的表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
--语句事件记录表,这些表记录了语句事件信息,当前语句事件表events_statements_current、历史语句事件表events_statements_history和长语句历史事件表events_statements_history_long、以及聚合后的摘要表summary,其中,summary表还可以根据帐号(account),主机(host),程序(program),线程(thread),用户(user)和全局(global)再进行细分)
show tables like '%statement%';

--等待事件记录表,与语句事件类型的相关记录表类似:
show tables like '%wait%';

--阶段事件记录表,记录语句执行的阶段事件的表
show tables like '%stage%';

--事务事件记录表,记录事务相关的事件的表
show tables like '%transaction%';

--监控文件系统层调用的表
show tables like '%file%';

--监视内存使用的表
show tables like '%memory%';

--动态对performance_schema进行配置的配置表
show tables like '%setup%';

常用表:

表名 记录内容 适合排查的问题范围
events_statements_summary_by_digest SQL 语句执行摘要,包括执行次数、总执行时间、IO 操作等 慢查询、高 IO 操作、SQL 语句执行效率问题
events_statements_current 当前正在执行的 SQL 语句信息,包括执行时间、线程 ID、SQL 语句文本等 正在执行的 SQL 语句分析、线程阻塞问题
events_waits_summary_by_instance 线程等待事件摘要,包括等待事件类型、等待次数、总等待时间等 线程阻塞、锁冲突、死锁问题
events_waits_current 当前正在等待的线程信息,包括等待事件类型、等待时间、线程 ID 等 线程阻塞、锁冲突、死锁问题
memory_summary_by_thread_by_event_name 线程内存使用情况,包括内存分配、释放、使用情况等 内存泄漏、内存使用效率问题

常用sql查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
--1、哪类的SQL执行最多?
SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--2、哪类SQL的平均响应时间最多?
SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--3、哪类SQL排序记录数最多?
SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--4、哪类SQL扫描记录数最多?
SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--5、哪类SQL使用临时表最多?
SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--6、哪类SQL返回结果集最多?
SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--7、哪个表物理IO最多?
SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC
--8、哪个表逻辑IO最多?
SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC
--9、哪个索引访问最多?
SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC
--10、哪个索引从来没有用过?
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;
--11、哪个等待事件消耗时间最多?
SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != 'idle' ORDER BY SUM_TIMER_WAIT DESC
--12-1、剖析某条SQL的执行情况,包括statement信息,stege信息,wait信息
SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE '%count(*)%';
--12-2、查看每个阶段的时间消耗
SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1553;
--12-3、查看每个阶段的锁等待情况
SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_longWHERE nesting_event_id = 1553;

两个角色:instruments and consumers

performance_schema 有两个重要的角色(概念上的):

  • instruments 数据收集者,负责收集原始数据,此部分数据只存在内存中,不会直接存到performance_schema的表中
  • consumers 数据消费者,负责处理instruments收集到的数据并存储到表中,所以我们查的实际上是这部分数据

举例;假设你想要分析 SQL 语句的执行效率,你可以使用 statement_digest instrument 收集 SQL 语句的执行时间、IO 操作等信息,然后使用 statement_summary consumer 将这些数据汇总到 events_statements_summary_by_digest 表格中。最后,你可以查询 events_statements_summary_by_digest 表格,找出执行时间最长的 SQL 语句,并进行优化。

information_schema

是一个元数据数据库,保存了数据库对象的信息,包括表结构、索引、用户权限等。

sys