带你认识MySQL sys schema

前言: mysql

MySQL 5.7中引入了一个新的sys schema,sys是一个MySQL自带的系统库,在安装MySQL 5.7之后的版本,使用mysqld进行初始化时,会自动建立sys库。sql

sys库里面的表、视图、函数、存储过程可使咱们更方便、快捷的了解到MySQL的一些信息,好比哪些语句使用了临时表、哪一个SQL没有使用索引、哪一个schema中有冗余索引、查找使用全表扫描的SQL、查找用户占用的IO等,sys库里这些视图中的数据,大可能是从performance_schema里面得到的。目标是把performance_schema的复杂度下降,让咱们更快的了解DB的运行状况。数据库

1.sys库总览

本篇文章是基于MySQL 5.7.23版本实验的。打开sys库(但愿你跟着我一块儿作哦),咱们会发现sys schema里包含1个表,100个视图,存储过程及函数共48个,以下图所示:服务器

image.png
image.png
image.png

其实咱们常常用到的是sys schema下的视图,下面将主要介绍各个视图的做用,咱们发现sys schema里的视图主要分为两类,一类是正常以字母开头的,共52个,一类是以 x$ 开头的,共48个。字母开头的视图显示的是格式化数据,更易读,而 x$ 开头的视图适合工具采集数据,显示的是原始未处理过的数据。session

下面咱们将按类别来分析以字母开头的52个视图:ide

  • host_summary:这个是服务器层面的,以IP分组,好比里面的视图host_summary_by_file_io;
  • user_summary:这个是用户层级的,以用户分组,好比里面的视图user_summary_by_file_io;
  • innodb:这个是InnoDB层面的,好比视图innodb_buffer_stats_by_schema;
  • io:这个是I/O层的统计,好比视图io_global_by_file_by_bytes;
  • memory:关于内存的使用状况,好比视图memory_by_host_by_current_bytes;
  • schema:关于schema级别的统计信息,好比schema_table_lock_waits;
  • session:关于会话级别的,这类视图少一些,只有session和session_ssl_status;
  • statement:关于语句级别的,好比statements_with_errors_or_warnings;
  • wait:关于等待的,好比视图waits_by_host_by_latency。

2.经常使用查询介绍

1,查看每一个客户端IP过来的链接消耗了多少资源。
mysql> select * from host_summary;函数

2,查看某个数据文件上发生了多少IO请求。
mysql> select * from io_global_by_file_by_bytes;工具

3,查看每一个用户消耗了多少资源。
mysql> select * from user_summary;.net

4,查看总共分配了多少内存。
mysql> select * from memory_global_total;orm

5,数据库链接来自哪里,以及这些链接对数据库的请求状况是怎样的?
查看当前链接状况。
mysql> select host, current_connections, statements from host_summary;

6,查看当前正在执行的SQL和执行show full processlist的效果至关。
mysql> select conn_id, user, current_statement, last_statement from session;

7,数据库中哪些SQL被频繁执行?
执行下面命令查询TOP 10最热SQL。
mysql> select db,exec_count,query from statement_analysis order by exec_count desc limit 10;

8,哪一个文件产生了最多的IO,读多,仍是写的多?
mysql> select * from io_global_by_file_by_bytes limit 10;

9,哪一个表上的IO请求最多?
mysql> select * from io_global_by_file_by_bytes where file like ‘%ibd’ order by total desc limit 10;

10,哪一个表被访问的最多?先访问statement_analysis,根据热门SQL排序找到相应的数据表。
mysql> select * from statement_analysis order by avg_latency desc limit 10;

11,哪些SQL执行了全表扫描或执行了排序操做?
mysql> select from statements_with_sorting;
mysql> select
from statements_with_full_table_scans;

12,哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表?
查看statement_analysis中哪一个SQL的tmp_tables 、tmp_disk_tables值大于0便可。
mysql> select db, query, tmp_tables, tmp_disk_tables from statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables+tmp_disk_tables) desc limit 20;

13,哪一个表占用了最多的buffer pool?
mysql> select * from innodb_buffer_stats_by_table order by allocated desc limit 10;

14,每一个库(database)占用多少buffer pool?
mysql> select * from innodb_buffer_stats_by_schema order by allocated desc limit 10;

15,每一个链接分配多少内存?
利用session表和memory_by_thread_by_current_bytes分配表进行关联查询。
mysql> select b.user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated,current_statement from memory_by_thread_by_current_bytes a, session b where a.thread_id = b.thd_id;

16,MySQL自增加字段的最大值和当前已经使用到的值?
mysql> select * from schema_auto_increment_columns;

17,MySQL有哪些冗余索引和无用索引?
mysql> select from schema_redundant_indexes;
mysql> select
from schema_unused_indexes;

18,查看事务等待状况
mysql> select * from innodb_lock_waits;

总结: 

本文主要介绍sys库相关内容,其实sys库有不少有用的查询,能够帮助你轻松了解数据库的运行状况,本来须要查找performance_schema中多个表才能得到的数据,如今查询一个视图便可知足。固然,sys库须要你详细去了解,总结出你须要的查询方法。

参考资料: 

公众号.jpg

相关文章
相关标签/搜索