mysql sys库使用功能

房东的猫 提交于 2020-01-06 20:18:14

MySQL5.7新库sys的一些实用功能

sys schema数据主要源自performance_schema。其目标是把查询performance_schema的复杂度降低,让DBA能更好地利用这个库里的数据,更快地了解MySQL的运行情况。sys schema包含了一些视图、函数和存储过程,sys schema用以帮助DBA及开发更方便的分析定位问题。

        那么对于我们DBA来说,sys schema的一些主要用途有哪些?

1、哪个用户或者哪个IP的客户端使用了最多的资源?

2、数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的?

3、数据库中哪些SQL被频繁执行?

4、哪个文件产生了最多的IO,读多还是写多?

5、哪个表上的IO请求最多?

6、哪个表被访问的最多?

7、哪些语句延迟比较严重?

8、哪些SQL执行了全表扫描或执行了排序操作?

9、哪些SQL使用了临时表,又有哪些SQL用到了磁盘临时表?

10、哪个库/表占用了最多的buffer pool?

11、每个连接分配多少内存?

12、自增长字段的最大值和当前已经使用到的值?

13、索引使用情况如何?有哪些冗余索引和无用索引?

14、内部有多个线程在运行?

 

下面一一举例说明:

1、哪个用户或者哪个IP的客户端使用了最多的资源?

mysql> select * from host_summary limit 1\G

*************************** 1. row ***************************

host: 10.10.4.201    //客户端主机

statements: 207    //执行的语句总数

statement_latency: 16.49 w    //语句等待时间,y-年 w-周 d-天 h-小时 m-分钟

statement_avg_latency: 13.39 h    //语句平均等待时间

table_scans: 0    //表扫描次数

file_ios: 22290615    //IO事件总数

file_io_latency: 3.67 m    //IO等待时间

current_connections: 1    //当前连接数

total_connections: 19    //总连接数

unique_users: 1    //连接过来的唯一用户数

current_memory: 0 bytes    //当前分配内存

total_memory_allocated: 0 bytes    //总共分配内存

 

2、数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的?

2.1、查看当前连接情况

mysql> select host, current_connections, statements from host_summary limit 1\G

*************************** 1. row ***************************

host: 10.10.4.201    //客户端主机

current_connections: 1    //当前连接数

statements: 207    //执行的语句总数

2.2、查看当前正在执行的SQL(和执行show full processlist的效果相当)

mysql> select conn_id, user, current_statement, last_statement from session where current_statement is not null limit 1\G

*************************** 1. row ***************************

conn_id: 115882553    //连接的ID,对应show processlist中的ID列

user: root@localhost    //该线程创建的用户名

current_statement: select conn_id, user, current_ ... _statement is not null limit 1    //该线程执行的语句

last_statement: NULL    //此线程最后一次执行的语句

 

3、数据库中哪些SQL被频繁执行?

查询执行次数top10的SQL:select db,exec_count,query from statement_analysis order by exec_count desc limit 10;

 

4、哪个文件产生了最多的IO,读多还是写多?

mysql> select * from io_global_by_file_by_bytes limit 1\G

*************************** 1. row ***************************

file: @@datadir/dedecms/dede_archives.MYD    //被操作的文件名

count_read: 16112940323    //总共有多少次读

total_read: 58.90 TiB    //总共读了多少字节

avg_read: 3.93 KiB    //平均每次读多少字节

count_write: 8830747    //总共多少次写

total_written: 1.89 GiB    //总共写了多少字节

avg_write: 230 bytes    //平均每次写多少字节

total: 58.90 TiB    //总共读写了多少字节

write_pct: 0.00    //写占比

 

5、哪个表上的IO请求最多?

通过以下sql查出被操做的文件名,然后就可以知道对应的是那个表:

mysql> select * from io_global_by_file_by_bytes limit 1\G

*************************** 1. row ***************************

file: @@datadir/dedecms/dede_archives.MYD    //被操作的文件名

count_read: 16112940323    //总共有多少次读

total_read: 58.90 TiB    //总共读了多少字节

avg_read: 3.93 KiB    //平均每次读多少字节

count_write: 8830747    //总共多少次写

total_written: 1.89 GiB    //总共写了多少字节

avg_write: 230 bytes    //平均每次写多少字节

total: 58.90 TiB    //总共读写了多少字节

write_pct: 0.00    //写占比

 

6、哪个表被访问的最多?

可以通过下面先查询执行最多的sql,然后找出对应的表:

mysql> select * from statement_analysis order by exec_count desc limit 10\G

*************************** 1. row ***************************

query: SELECT * FROM `dede_archives` WHERE `id` = ? LIMIT ?, ...    //归一化的SQL

db: dedecms    //在哪个DB中执行

full_scan:    //全表扫描的次数

exec_count: 5781519    //该SQL执行的总次数

err_count: 0    //执行错误的次数

warn_count: 0    //执行警告的次数

total_latency: 54.19 m    //总共发生延迟的时间

max_latency: 6.89 s    //最大延迟时间

avg_latency: 562.42 us    //平均延迟时间

lock_latency: 38.70 m    //因锁等待占用的总时间

rows_sent: 5478992    //执行该SQL返回的总行数

rows_sent_avg: 1    //每次执行该SQL平均返回的行数

rows_examined: 5478992    //该语句扫描的次数

rows_examined_avg: 1    //每次执行该SQL平均扫描的次数

rows_affected: 0    //该语句影响到的行数

rows_affected_avg: 0    //每次执行该语句平均影响到的行数

tmp_tables: 0    //该SQL形成内存临时表的总次数

tmp_disk_tables: 0    //该SQL形成文件临时表的总次数

rows_sorted: 0    //该SQL总共排序的行数

sort_merge_passes: 0    //用于排序中合并的总次数

digest: 874bf766d714c115ff67c6ecc85d7172    //该语句的hash值

first_seen: 2017-04-06 19:28:07    //该SQL最早出现的时间

last_seen: 2018-01-23 11:28:26    //该SQL最近出现的时间

 

7、哪些语句延迟比较严重?

查看statement_analysis中avg_latency的最高的SQL:

mysql> select * from statement_analysis order by avg_latency desc limit 1\G

*************************** 1. row ***************************

query: SELECT SQL_NO_CACHE * FROM `order_pay`    //归一化的SQL

db: dyfb2c    //在哪个DB中执行

full_scan: *    //全表扫描的次数

exec_count: 330    //该SQL执行的总次数

err_count: 0    //发生错误的次数

warn_count: 0    //发生警告的次数

total_latency: 329.22 ms    //总共发生的延迟时间

max_latency: 2.03 ms    //最大延迟时间

avg_latency: 997.63 us    //平均延迟时间

lock_latency: 13.50 ms    //因锁等待占用的总时间

rows_sent: 310860    //执行该SQL返回的总行数

rows_sent_avg: 942    //执行该SQL平均返回的行数

rows_examined: 310860    //该语句扫描的次数

rows_examined_avg: 942    //每次执行该SQL平均扫描的次数

rows_affected: 0    //该语句影响到的行数

rows_affected_avg: 0    //每次执行该语句平均影响到的行数

tmp_tables: 0    //该SQL形成内存临时表的总次数

tmp_disk_tables: 0    //该SQL形成文件临时表的总次数

rows_sorted: 0    //该SQL总共排序的行数

sort_merge_passes: 0    //用于排序中合并的总次数

digest: 874bf766d714c115ff67c6ecc85d7172    //该语句的hash值

first_seen: 2017-04-06 19:28:07    //该SQL最早出现的时间

last_seen: 2018-01-23 11:28:26    //该SQL最近出现的时间

 

8、哪些SQL执行了全表扫描或执行了排序操作?

8.1、全表扫描:

mysql> select * from statements_with_full_table_scans limit 1\G

*************************** 1. row ***************************

query: SELECT `usertype` , `userid` , ... ERE `userid` = ? LIMIT ?, ...

db: dedecms

exec_count: 2576

total_latency: 996.10 ms

no_index_used_count: 2576

no_good_index_used_count: 0

no_index_used_pct: 100

rows_sent: 0

rows_examined: 36496

rows_sent_avg: 0

rows_examined_avg: 14

first_seen: 2017-03-08 16:12:55

last_seen: 2018-01-23 11:33:44

digest: c5b6efc92a51003d6f495e1c4233bdc4

8.2、排序操作:

mysql> select * from statements_with_sorting limit 1\G

*************************** 1. row ***************************

query: SELECT `arc` . `id` , `arc` .  ...  `senddate` DESC LIMIT ?, ...

db: dedecms

exec_count: 2329617

total_latency: 10.44 h

sort_merge_passes: 0

avg_sort_merges: 0

sorts_using_scans: 2329610

sort_using_range: 0

rows_sorted: 5731397

avg_rows_sorted: 2

first_seen: 2017-06-05 19:59:08

last_seen: 2018-01-23 11:54:53

digest: dec0ec92c5aad756414d4b26c7e17245

 

9、哪些SQL使用了临时表,又有哪些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 1\G

*************************** 1. row ***************************

db: dedecms

query: SELECT `arc` . `id` , `arc` .  ...  `senddate` DESC LIMIT ?, ...

tmp_tables: 1101140    //该SQL形成内存临时表的总次数

tmp_disk_tables: 0    //该SQL形成文件临时表的总次数

 

10、哪个库/表占用了最多的buffer pool?

库:

mysql> select * from innodb_buffer_stats_by_schema order by allocated desc limit 1\G

*************************** 1. row ***************************

object_schema: tpshop    //库名

allocated: 583.83 MiB    //分配的buffer pool大小

data: 468.04 MiB    //实际缓存的数据大小

pages: 37365    //缓存的page数

pages_hashed: 37365    //Buffer  pool中进行hash 索引的page

pages_old: 37365    //Buffer pool中的旧页,可能被置换出去

rows_cached: 320285    //Buffer pool中以行为单位的缓存

表:

mysql> select * from innodb_buffer_stats_by_table order by allocated desc limit 1\G

*************************** 1. row ***************************

object_schema: 160dyf_dede    //库名

object_name: dede_arctype    //表名

allocated: 96.00 KiB    //基于表分配的buffer pool大小

data: 37.80 KiB    //基于表实际缓存的数据大小

pages: 6    //缓存的page数

pages_hashed: 6    //Buffer  pool中进行hash 索引的page

pages_old: 6    //Buffer pool中的旧页,可能被置换出去

rows_cached: 37    //Buffer pool中以行为单位的缓存

 

11、每个连接分配多少内存?

利用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 limit 1\G

*************************** 1. row ***************************

user: rep@10.8.2.198    //该线程创建的用户名

current_count_used: 0    //当前使用的内存块还没有释放

current_allocated: 0 bytes    //当前分配的内存大小(字节)而且没有被释放出来

current_avg_alloc: 0 bytes    //平均分配的blocks

current_max_alloc: 0 bytes    //当前线程分配的最多内存

total_allocated: 0 bytes    //当前连接总共分配的内存大小

current_statement: NULL

 

12、自增长字段的最大值和当前已经使用到的值?

select * from schema_auto_increment_columns order by auto_increment_ratio desc limit 3;

 

13、索引使用情况如何?有哪些冗余索引和无用索引?

13.1、索引使用情况:

mysql> select * from schema_index_statistics limit 1\G

*************************** 1. row ***************************

table_schema: dedecms

table_name: dede_archives

index_name: mainindex

rows_selected: 12142972982

select_latency: 6.66 h

rows_inserted: 0

insert_latency: 0 ps

rows_updated: 0

update_latency: 0 ps

rows_deleted: 0

delete_latency: 0 ps

13.2、冗余索引:

mysql> select * from schema_redundant_indexes limit 1\G

*************************** 1. row ***************************

table_schema: 160dyf_dede    //

table_name: dede_member_group

redundant_index_name: id

redundant_index_columns: id

redundant_index_non_unique: 1

dominant_index_name: PRIMARY

dominant_index_columns: id

dominant_index_non_unique: 0

subpart_exists: 0

sql_drop_index: ALTER TABLE `160dyf_dede`.`dede_member_group` DROP INDEX `id`

13.3、无用索引:

mysql> select * from schema_unused_indexes limit 1\G

*************************** 1. row ***************************

object_schema: 160dyf_dede

object_name: dede_addonimages

index_name: imagesMain

 

14、内部有多个线程在运行?

select user, count(*) from processlist group by user;

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!