前言: 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的運行狀況。數據庫
本篇文章是基於MySQL 5.7.23版本實驗的。打開sys庫(但願你跟着我一塊兒作哦),咱們會發現sys schema裏包含1個表,100個視圖,存儲過程及函數共48個,以下圖所示:服務器
其實咱們常常用到的是sys schema下的視圖,下面將主要介紹各個視圖的做用,咱們發現sys schema裏的視圖主要分爲兩類,一類是正常以字母開頭的,共52個,一類是以 x$ 開頭的,共48個。字母開頭的視圖顯示的是格式化數據,更易讀,而 x$ 開頭的視圖適合工具採集數據,顯示的是原始未處理過的數據。session
下面咱們將按類別來分析以字母開頭的52個視圖:函數
1,查看每一個客戶端IP過來的鏈接消耗了多少資源。
mysql> select * from host_summary;2,查看某個數據文件上發生了多少IO請求。
mysql> select * from io_global_by_file_by_bytes;工具3,查看每一個用戶消耗了多少資源。
mysql> select * from user_summary;spa4,查看總共分配了多少內存。
mysql> select * from memory_global_total;.net5,數據庫鏈接來自哪裏,以及這些鏈接對數據庫的請求狀況是怎樣的?
查看當前鏈接狀況。
mysql> select host, current_connections, statements from host_summary;orm6,查看當前正在執行的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庫須要你詳細去了解,總結出你須要的查詢方法。
參考資料: