MySQL 5.7中引入了一个新的sys schema,sys是一个MySQL自带的系统库,在安装MySQL 5.7以后的版本,使用mysqld进行初始化时,会自动创建sys库。
sys库里面的表、视图、函数、存储过程可以使我们更方便、快捷的了解到MySQL的一些信息,比如哪些语句使用了临时表、哪个SQL没有使用索引、哪个schema中有冗余索引、查找使用全表扫描的SQL、查找用户占用的IO等,sys库里这些视图中的数据,大多是从performance_schema里面获得的。目标是把performance_schema的复杂度降低,让我们更快的了解DB的运行情况。
1、sys库总览
基于MySQL 5.7.24版本实验的。我们会发现sys schema里包含1个表,100个视图,存储过程及函数共48个,如下图所示:
我们经常用到的是sys schema下的视图,下面将主要介绍各个视图的作用,我们发现sys schema里的视图主要分为两类,一类是正常以字母开头的,共52个,一类是以 x$ 开头的,共48个。字母开头的视图显示的是格式化数据,更易读,而 x$ 开头的视图适合工具采集数据,显示的是原始未处理过的数据。
下面我们将按类别来分析以字母开头的52个视图:
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过来的连接消耗了多少资源
select * from host_summary;
2)、查看某个数据文件上发生了多少IO请求
select * from io_global_by_file_by_bytes;
3)、查看每个用户消耗了多少资源
select * from user_summary;
4)、查看总共分配了多少内存
select * from memory_global_total;
5)、数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的?
——查看当前连接情况
select host,current_connections,statements from host_summary;
6)、查看当前正在执行的SQL和执行show full processlist的效果相当
select conn_id,user,current_statement,last_statement from session;
7)、数据库中哪些SQL被频繁执行?
——执行下面命令查询TOP 10最热SQL
select db,exec_count,query from statement_analysis order by exec_count desc limit 10;
8)、哪个文件产生了最多的IO,读多,还是写的多
select * from io_global_by_file_by_bytes limit 10;
9)、哪个表上的IO请求最多
select * from io_global_by_file_by_bytes where file like '%ibd' order by total desc limit 10;
10)、哪个表被访问的最多?
先访问statement_analysis,根据热门SQL排序找到相应的数据表。
哪些语句延迟比较严重?
查看statement_analysis中avg_latency的最高的SQL。
select * from statement_analysis order by avg_latency desc limit 10;
11)、或者查看statements_with_runtimes_in_95th_percentile视图
select * from statements_with_runtimes_in_95th_percentile;
12)、哪些SQL执行了全表扫描或执行了排序操作
select * from statements_with_sorting;
select * from statements_with_full_table_scans;
13)、哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表?
查看statement_analysis中哪个SQL的tmp_tables 、tmp_disk_tables值大于0即可
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;
14)、也可以查看statements_with_temp_tables视图
select * from statements_with_temp_tables;
15)、哪个表占用了最多的buffer pool
select * from innodb_buffer_stats_by_table order by allocated desc limit 10;
16)、每个库(database)占用多少buffer pool
select * from innodb_buffer_stats_by_schema order by allocated desc limit 10;
17)、每个连接分配多少内存?
——利用session表和memory_by_thread_by_current_bytes分配表进行关联查询
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;
18)、MySQL自增长字段的最大值和当前已经使用到的值
select * from schema_auto_increment_columns;
19)、MySQL索引使用情况统计
select * from schema_index_statistics;
20)、MySQL有哪些冗余索引和无用索引
select * from schema_redundant_indexes;
select * from schema_unused_indexes;
21)、查看事务等待情况
select * from innodb_lock_waits;
22)、MySQL内部有多个线程在运行
——MySQL内部的线程类型及数量。
select user,count(*) from processlist group by user;
23)、查看表访问量
select table_schema,table_name,sum(io_read_requests+io_write_requests) io from sys.schema_table_statistics group by table_schema,table_name order by io desc limit 10;
24)、查看数据库连接情况
select * from sys.processlist;
select * from sys.session limit 10;
select * from sys.x$processlist;
select * from sys.x$session;
25)、查看冗余索引
select table_schema,table_name,redundant_index_name,redundant_index_columns,dominant_index_name,dominant_index_columns from sys.schema_redundant_indexes;
26)、查看未使用索引
select * from sys.schema_unused_indexes;
27)、表自增ID监控
select * from sys.schema_auto_increment_columns limit 10;
28)、查看实际消耗磁盘IO的文件
select file,avg_read+avg_write as avg_io from sys.io_global_by_file_by_bytes order by avg_io desc limit 10;
总结:
主要介绍sys库相关内容,其实sys库有很多有用的查询,可以帮助你轻松了解数据库的运行情况,原本需要查找performance_schema中多个表才能获得的数据,现在查询一个视图即可满足。当然,sys库需要你详细去了解,总结出你需要的查询方法。
3、performance_schema库常用SQL
#查看没有主键的表
SELECT DISTINCT t.table_schema, t.table_name
FROM information_schema.tables AS t
LEFT JOIN information_schema.columns AS c ON t.table_schema = c.table_schema
AND t.table_name = c.table_name AND c.column_key = "PRI"
WHERE t.table_schema NOT IN ('information_schema', 'mysql', 'performance_schema')
AND c.table_name IS NULL AND t.table_type != 'VIEW';
#查看是谁创建的临时表
SELECT user, host, event_name, count_star AS cnt, sum_created_tmp_disk_tables AS tmp_disk_tables,
sum_created_tmp_tables AS tmp_tables
FROM performance_schema.events_statements_summary_by_account_by_event_name
WHERE sum_created_tmp_disk_tables > 0
OR sum_created_tmp_tables > 0 ;
#没有正确关闭数据库连接的用户
SELECT ess.user, ess.host
, (a.total_connections - a.current_connections) - ess.count_star as not_closed
, ((a.total_connections - a.current_connections) - ess.count_star) * 100 /
(a.total_connections - a.current_connections) as pct_not_closed
FROM performance_schema.events_statements_summary_by_account_by_event_name ess
JOIN performance_schema.accounts a on (ess.user = a.user and ess.host = a.host)
WHERE ess.event_name = 'statement/com/quit'
AND (a.total_connections - a.current_connections) > ess.count_star ;