前言:
MySQL 5.7中引入了一個新的sys schema,sys是一個MySQL自帶的系統庫,在安裝MySQL 5.7以后的版本,使用mysqld進行初始化時,會自動創建sys庫。
sys庫里面的表、視圖、函數、存儲過程可以使我們更方便、快捷的了解到MySQL的一些信息,比如哪些語句使用了臨時表、哪個SQL沒有使用索引、哪個schema中有冗余索引、查找使用全表掃描的SQL、查找用戶占用的IO等,sys庫里這些視圖中的數據,大多是從performanceschema里面獲得的。目標是把performanceschema的復雜度降低,讓我們更快的了解DB的運行情況。
1.sys庫總覽
本篇文章是基于MySQL 5.7.23版本實驗的。打開sys庫(希望你跟著我一起做哦),我們會發現sys schema里包含1個表,100個視圖,存儲過程及函數共48個,如下圖所示:



其實我們經常用到的是sys schema下的視圖,下面將主要介紹各個視圖的作用,我們發現sys schema里的視圖主要分為兩類,一類是正常以字母開頭的,共52個,一類是以 x$ 開頭的,共48個。字母開頭的視圖顯示的是格式化數據,更易讀,而 x$ 開頭的視圖適合工具采集數據,顯示的是原始未處理過的數據。
下面我們將按類別來分析以字母開頭的52個視圖:
- host_summary:這個是服務器層面的,以IP分組,比如里面的視圖hostsummarybyfileio;
- user_summary:這個是用戶層級的,以用戶分組,比如里面的視圖usersummarybyfileio;
- innodb:這個是InnoDB層面的,比如視圖innodbbufferstatsbyschema;
- io:這個是I/O層的統計,比如視圖ioglobalbyfileby_bytes;
- memory:關于內存的使用情況,比如視圖memorybyhostbycurrent_bytes;
- schema:關于schema級別的統計信息,比如schematablelock_waits;
- session:關于會話級別的,這類視圖少一些,只有session和sessionsslstatus;
- statement:關于語句級別的,比如statementswitherrorsorwarnings;
- wait:關于等待的,比如視圖waitsbyhostbylatency。
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;
4,查看總共分配了多少內存。
mysql> select * from memory_global_total;
5,數據庫連接來自哪里,以及這些連接對數據庫的請求情況是怎樣的?查看當前連接情況。mysql> select host, currentconnections, statements from hostsummary;
6,查看當前正在執行的SQL和執行show full processlist的效果相當。
mysql> select connid, user, currentstatement, last_statement from session;
7,數據庫中哪些SQL被頻繁執行?執行下面命令查詢TOP 10最熱SQL。
mysql> select db,execcount,query from statementanalysis 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語句使用了臨時表,又有哪些用到了磁盤臨時表?查看statementanalysis中哪個SQL的tmptables 、tmpdisktables值大于0即可。
mysql> select db, query, tmptables, tmpdisktables from statementanalysis where tmptables>0 or tmpdisktables >0 order by (tmptables+tmpdisktables) 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表和memorybythreadbycurrent_bytes分配表進行關聯查詢。
mysql> select b.user, currentcountused, currentallocated, currentavgalloc, currentmaxalloc, totalallocated,currentstatement from memorybythreadbycurrentbytes a, session b where a.threadid = b.thdid;
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庫需要你詳細去了解,總結出你需要的查詢方法。
參考資料:
- https://blog.csdn.net/l1028386804/article/details/89521908
歡迎關注個人公眾號『MySQL技術』