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: [email protected] //該線程創建的用戶名
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;