MYSQL performance schema详解
MYSQL performance schema詳解
0、performance_schema的介紹
? MySQL的performance schema 用于監控MySQL server在一個較低級別的運行過程中的資源消耗、資源等待等情況。
? 特點如下:
? 1、提供了一種在數據庫運行時實時檢查server的內部執行情況的方法。performance_schema 數據庫中的表使用performance_schema存儲引擎。該數據庫主要關注數據庫運行過程中的性能相關的數據,與information_schema不同,information_schema主要關注server運行過程中的元數據信息
? 2、performance_schema通過監視server的事件來實現監視server內部運行情況, “事件”就是server內部活動中所做的任何事情以及對應的時間消耗,利用這些信息來判斷server中的相關資源消耗在了哪里?一般來說,事件可以是函數調用、操作系統的等待、SQL語句執行的階段(如sql語句執行過程中的parsing 或 sorting階段)或者整個SQL語句與SQL語句集合。事件的采集可以方便的提供server中的相關存儲引擎對磁盤文件、表I/O、表鎖等資源的同步調用信息。
? 3、performance_schema中的事件與寫入二進制日志中的事件(描述數據修改的events)、事件計劃調度程序(這是一種存儲程序)的事件不同。performance_schema中的事件記錄的是server執行某些活動對某些資源的消耗、耗時、這些活動執行的次數等情況。
? 4、performance_schema中的事件只記錄在本地server的performance_schema中,其下的這些表中數據發生變化時不會被寫入binlog中,也不會通過復制機制被復制到其他server中。
? 5、 當前活躍事件、歷史事件和事件摘要相關的表中記錄的信息。能提供某個事件的執行次數、使用時長。進而可用于分析某個特定線程、特定對象(如mutex或file)相關聯的活動。
? 6、PERFORMANCE_SCHEMA存儲引擎使用server源代碼中的“檢測點”來實現事件數據的收集。對于performance_schema實現機制本身的代碼沒有相關的單獨線程來檢測,這與其他功能(如復制或事件計劃程序)不同
? 7、收集的事件數據存儲在performance_schema數據庫的表中。這些表可以使用SELECT語句查詢,也可以使用SQL語句更新performance_schema數據庫中的表記錄(如動態修改performance_schema的setup_*開頭的幾個配置表,但要注意:配置表的更改會立即生效,這會影響數據收集)
? 8、performance_schema的表中的數據不會持久化存儲在磁盤中,而是保存在內存中,一旦服務器重啟,這些數據會丟失(包括配置表在內的整個performance_schema下的所有數據)
? 9、MySQL支持的所有平臺中事件監控功能都可用,但不同平臺中用于統計事件時間開銷的計時器類型可能會有所差異。
1、performance schema入門
? 在mysql的5.7版本中,性能模式是默認開啟的,如果想要顯式的關閉的話需要修改配置文件,不能直接進行修改,會報錯Variable ‘performance_schema’ is a read only variable。
--查看performance_schema的屬性 mysql> SHOW VARIABLES LIKE 'performance_schema'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | performance_schema | ON | +--------------------+-------+ 1 row in set (0.01 sec)--在配置文件中修改performance_schema的屬性值,on表示開啟,off表示關閉 [mysqld] performance_schema=ON--切換數據庫 use performance_schema;--查看當前數據庫下的所有表,會看到有很多表存儲著相關的信息 show tables;--可以通過show create table tablename來查看創建表的時候的表結構 mysql> show create table setup_consumers; +-----------------+--------------------------------- | Table | Create Table +-----------------+--------------------------------- | setup_consumers | CREATE TABLE `setup_consumers` (`NAME` varchar(64) NOT NULL, `ENABLED` enum('YES','NO') NOT NULL ) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8 | +-----------------+--------------------------------- 1 row in set (0.00 sec)? 想要搞明白后續的內容,同學們需要理解兩個基本概念:
? instruments: 生產者,用于采集mysql中各種各樣的操作產生的事件信息,對應配置表中的配置項我們可以稱為監控采集配置項。
? consumers:消費者,對應的消費者表用于存儲來自instruments采集的數據,對應配置表中的配置項我們可以稱為消費存儲配置項。
2、performance_schema表的分類
? performance_schema庫下的表可以按照監視不同的緯度就行分組。
--語句事件記錄表,這些表記錄了語句事件信息,當前語句事件表events_statements_current、歷史語句事件表events_statements_history和長語句歷史事件表events_statements_history_long、以及聚合后的摘要表summary,其中,summary表還可以根據帳號(account),主機(host),程序(program),線程(thread),用戶(user)和全局(global)再進行細分) show tables like '%statement%';--等待事件記錄表,與語句事件類型的相關記錄表類似: show tables like '%wait%';--階段事件記錄表,記錄語句執行的階段事件的表 show tables like '%stage%';--事務事件記錄表,記錄事務相關的事件的表 show tables like '%transaction%';--監控文件系統層調用的表 show tables like '%file%';--監視內存使用的表 show tables like '%memory%';--動態對performance_schema進行配置的配置表 show tables like '%setup%';3、performance_schema的簡單配置與使用
? 數據庫剛剛初始化并啟動時,并非所有instruments(事件采集項,在采集項的配置表中每一項都有一個開關字段,或為YES,或為NO)和consumers(與采集項類似,也有一個對應的事件類型保存表配置項,為YES就表示對應的表保存性能數據,為NO就表示對應的表不保存性能數據)都啟用了,所以默認不會收集所有的事件,可能你需要檢測的事件并沒有打開,需要進行設置,可以使用如下兩個語句打開對應的instruments和consumers(行計數可能會因MySQL版本而異)。
--打開等待事件的采集器配置項開關,需要修改setup_instruments配置表中對應的采集器配置項 UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES'where name like 'wait%';--打開等待事件的保存表配置開關,修改setup_consumers配置表中對應的配置項 UPDATE setup_consumers SET ENABLED = 'YES'where name like '%wait%';--當配置完成之后可以查看當前server正在做什么,可以通過查詢events_waits_current表來得知,該表中每個線程只包含一行數據,用于顯示每個線程的最新監視事件 select * from events_waits_current\G *************************** 1. row ***************************THREAD_ID: 11EVENT_ID: 570END_EVENT_ID: 570EVENT_NAME: wait/synch/mutex/innodb/buf_dblwr_mutexSOURCE: TIMER_START: 4508505105239280TIMER_END: 4508505105270160TIMER_WAIT: 30880SPINS: NULLOBJECT_SCHEMA: NULLOBJECT_NAME: NULLINDEX_NAME: NULLOBJECT_TYPE: NULL OBJECT_INSTANCE_BEGIN: 67918392NESTING_EVENT_ID: NULLNESTING_EVENT_TYPE: NULLOPERATION: lockNUMBER_OF_BYTES: NULLFLAGS: NULL /*該信息表示線程id為11的線程正在等待buf_dblwr_mutex鎖,等待事件為30880 屬性說明:id:事件來自哪個線程,事件編號是多少event_name:表示檢測到的具體的內容source:表示這個檢測代碼在哪個源文件中以及行號timer_start:表示該事件的開始時間timer_end:表示該事件的結束時間timer_wait:表示該事件總的花費時間 注意:_current表中每個線程只保留一條記錄,一旦線程完成工作,該表中不會再記錄該線程的事件信息 *//* _history表中記錄每個線程應該執行完成的事件信息,但每個線程的事件信息只會記錄10條,再多就會被覆蓋,*_history_long表中記錄所有線程的事件信息,但總記錄數量是10000,超過就會被覆蓋掉 */ select thread_id,event_id,event_name,timer_wait from events_waits_history order by thread_id limit 21;/* summary表提供所有事件的匯總信息,該組中的表以不同的方式匯總事件數據(如:按用戶,按主機,按線程等等)。例如:要查看哪些instruments占用最多的時間,可以通過對events_waits_summary_global_by_event_name表的COUNT_STAR或SUM_TIMER_WAIT列進行查詢(這兩列是對事件的記錄數執行COUNT(*)、事件記錄的TIMER_WAIT列執行SUM(TIMER_WAIT)統計而來) */ SELECT EVENT_NAME,COUNT_STAR FROM events_waits_summary_global_by_event_name ORDER BY COUNT_STAR DESC LIMIT 10;/* instance表記錄了哪些類型的對象會被檢測。這些對象在被server使用時,在該表中將會產生一條事件記錄,例如,file_instances表列出了文件I/O操作及其關聯文件名 */ select * from file_instances limit 20;4、常用配置項的參數說明
1、啟動選項
performance_schema_consumer_events_statements_current=TRUE 是否在mysql server啟動時就開啟events_statements_current表的記錄功能(該表記錄當前的語句事件信息),啟動之后也可以在setup_consumers表中使用UPDATE語句進行動態更新setup_consumers配置表中的events_statements_current配置項,默認值為TRUEperformance_schema_consumer_events_statements_history=TRUE 與performance_schema_consumer_events_statements_current選項類似,但該選項是用于配置是否記錄語句事件短歷史信息,默認為TRUEperformance_schema_consumer_events_stages_history_long=FALSE 與performance_schema_consumer_events_statements_current選項類似,但該選項是用于配置是否記錄語句事件長歷史信息,默認為FALSE除了statement(語句)事件之外,還支持:wait(等待)事件、state(階段)事件、transaction(事務)事件,他們與statement事件一樣都有三個啟動項分別進行配置,但這些等待事件默認未啟用,如果需要在MySQL Server啟動時一同啟動,則通常需要寫進my.cnf配置文件中 performance_schema_consumer_global_instrumentation=TRUE 是否在MySQL Server啟動時就開啟全局表(如:mutex_instances、rwlock_instances、cond_instances、file_instances、users、hostsaccounts、socket_summary_by_event_name、file_summary_by_instance等大部分的全局對象計數統計和事件匯總統計信息表 )的記錄功能,啟動之后也可以在setup_consumers表中使用UPDATE語句進行動態更新全局配置項 默認值為TRUEperformance_schema_consumer_statements_digest=TRUE 是否在MySQL Server啟動時就開啟events_statements_summary_by_digest 表的記錄功能,啟動之后也可以在setup_consumers表中使用UPDATE語句進行動態更新digest配置項 默認值為TRUEperformance_schema_consumer_thread_instrumentation=TRUE 是否在MySQL Server啟動時就開啟events_xxx_summary_by_yyy_by_event_name表的記錄功能,啟動之后也可以在setup_consumers表中使用UPDATE語句進行動態更新線程配置項 默認值為TRUEperformance_schema_instrument[=name] 是否在MySQL Server啟動時就啟用某些采集器,由于instruments配置項多達數千個,所以該配置項支持key-value模式,還支持%號進行通配等,如下:# [=name]可以指定為具體的Instruments名稱(但是這樣如果有多個需要指定的時候,就需要使用該選項多次),也可以使用通配符,可以指定instruments相同的前綴+通配符,也可以使用%代表所有的instruments## 指定開啟單個instruments--performance-schema-instrument= 'instrument_name=value'## 使用通配符指定開啟多個instruments--performance-schema-instrument= 'wait/synch/cond/%=COUNTED'## 開關所有的instruments--performance-schema-instrument= '%=ON'--performance-schema-instrument= '%=OFF'注意,這些啟動選項要生效的前提是,需要設置performance_schema=ON。另外,這些啟動選項雖然無法使用show variables語句查看,但我們可以通過setup_instruments和setup_consumers表查詢這些選項指定的值。2、系統變量
show variables like '%performance_schema%'; --重要的屬性解釋 performance_schema=ON /* 控制performance_schema功能的開關,要使用MySQL的performance_schema,需要在mysqld啟動時啟用,以啟用事件收集功能 該參數在5.7.x之前支持performance_schema的版本中默認關閉,5.7.x版本開始默認開啟 注意:如果mysqld在初始化performance_schema時發現無法分配任何相關的內部緩沖區,則performance_schema將自動禁用,并將performance_schema設置為OFF */performance_schema_digests_size=10000 /* 控制events_statements_summary_by_digest表中的最大行數。如果產生的語句摘要信息超過此最大值,便無法繼續存入該表,此時performance_schema會增加狀態變量 */ performance_schema_events_statements_history_long_size=10000 /* 控制events_statements_history_long表中的最大行數,該參數控制所有會話在events_statements_history_long表中能夠存放的總事件記錄數,超過這個限制之后,最早的記錄將被覆蓋 全局變量,只讀變量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默認為10000,5.6.6及其之后的版本默認值為-1,通常情況下,自動計算的值都是10000 * 5.7.x版本中,默認值為-1,通常情況下,自動計算的值都是10000 */ performance_schema_events_statements_history_size=10 /* 控制events_statements_history表中單個線程(會話)的最大行數,該參數控制單個會話在events_statements_history表中能夠存放的事件記錄數,超過這個限制之后,單個會話最早的記錄將被覆蓋 全局變量,只讀變量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默認為10,5.6.6及其之后的版本默認值為-1,通常情況下,自動計算的值都是10 * 5.7.x版本中,默認值為-1,通常情況下,自動計算的值都是10 除了statement(語句)事件之外,wait(等待)事件、state(階段)事件、transaction(事務)事件,他們與statement事件一樣都有三個參數分別進行存儲限制配置,有興趣的同學自行研究,這里不再贅述 */ performance_schema_max_digest_length=1024 /* 用于控制標準化形式的SQL語句文本在存入performance_schema時的限制長度,該變量與max_digest_length變量相關(max_digest_length變量含義請自行查閱相關資料) 全局變量,只讀變量,默認值1024字節,整型值,取值范圍0~1048576 */ performance_schema_max_sql_text_length=1024 /* 控制存入events_statements_current,events_statements_history和events_statements_history_long語句事件表中的SQL_TEXT列的最大SQL長度字節數。 超出系統變量performance_schema_max_sql_text_length的部分將被丟棄,不會記錄,一般情況下不需要調整該參數,除非被截斷的部分與其他SQL比起來有很大差異 全局變量,只讀變量,整型值,默認值為1024字節,取值范圍為0~1048576,5.7.6版本引入 降低系統變量performance_schema_max_sql_text_length值可以減少內存使用,但如果匯總的SQL中,被截斷部分有較大差異,會導致沒有辦法再對這些有較大差異的SQL進行區分。 增加該系統變量值會增加內存使用,但對于匯總SQL來講可以更精準地區分不同的部分。 */5、重要配置表的相關說明
/* performance_timers表中記錄了server中有哪些可用的事件計時器 字段解釋:timer_name:表示可用計時器名稱,CYCLE是基于CPU周期計數器的定時器timer_frequency:表示每秒鐘對應的計時器單位的數量,CYCLE計時器的換算值與CPU的頻率相關、timer_resolution:計時器精度值,表示在每個計時器被調用時額外增加的值timer_overhead:表示在使用定時器獲取事件時開銷的最小周期值 */ select * from performance_timers;/* setup_timers表中記錄當前使用的事件計時器信息 字段解釋:name:計時器類型,對應某個事件類別timer_name:計時器類型名稱 */ select * from setup_timers;/* setup_consumers表中列出了consumers可配置列表項 字段解釋:NAME:consumers配置名稱ENABLED:consumers是否啟用,有效值為YES或NO,此列可以使用UPDATE語句修改。 */ select * from setup_consumers;/* setup_instruments 表列出了instruments 列表配置項,即代表了哪些事件支持被收集: 字段解釋:NAME:instruments名稱,instruments名稱可能具有多個部分并形成層次結構ENABLED:instrumetns是否啟用,有效值為YES或NO,此列可以使用UPDATE語句修改。如果設置為NO,則這個instruments不會被執行,不會產生任何的事件信息TIMED:instruments是否收集時間信息,有效值為YES或NO,此列可以使用UPDATE語句修改,如果設置為NO,則這個instruments不會收集時間信息 */ SELECT * FROM setup_instruments;/* setup_actors表的初始內容是匹配任何用戶和主機,因此對于所有前臺線程,默認情況下啟用監視和歷史事件收集功能 字段解釋:HOST:與grant語句類似的主機名,一個具體的字符串名字,或使用“%”表示“任何主機”USER:一個具體的字符串名稱,或使用“%”表示“任何用戶”ROLE:當前未使用,MySQL 8.0中才啟用角色功能ENABLED:是否啟用與HOST,USER,ROLE匹配的前臺線程的監控功能,有效值為:YES或NOHISTORY:是否啟用與HOST, USER,ROLE匹配的前臺線程的歷史事件記錄功能,有效值為:YES或NO */ SELECT * FROM setup_actors;/* setup_objects表控制performance_schema是否監視特定對象。默認情況下,此表的最大行數為100行。 字段解釋:OBJECT_TYPE:instruments類型,有效值為:“EVENT”(事件調度器事件)、“FUNCTION”(存儲函數)、“PROCEDURE”(存儲過程)、“TABLE”(基表)、“TRIGGER”(觸發器),TABLE對象類型的配置會影響表I/O事件(wait/io/table/sql/handler instrument)和表鎖事件(wait/lock/table/sql/handler instrument)的收集OBJECT_SCHEMA:某個監視類型對象涵蓋的數據庫名稱,一個字符串名稱,或“%”(表示“任何數據庫”)OBJECT_NAME:某個監視類型對象涵蓋的表名,一個字符串名稱,或“%”(表示“任何數據庫內的對象”)ENABLED:是否開啟對某個類型對象的監視功能,有效值為:YES或NO。此列可以修改TIMED:是否開啟對某個類型對象的時間收集功能,有效值為:YES或NO,此列可以修改 */ SELECT * FROM setup_objects;/* threads表對于每個server線程生成一行包含線程相關的信息, 字段解釋:THREAD_ID:線程的唯一標識符(ID)NAME:與server中的線程檢測代碼相關聯的名稱(注意,這里不是instruments名稱)TYPE:線程類型,有效值為:FOREGROUND、BACKGROUND。分別表示前臺線程和后臺線程PROCESSLIST_ID:對應INFORMATION_SCHEMA.PROCESSLIST表中的ID列。PROCESSLIST_USER:與前臺線程相關聯的用戶名,對于后臺線程為NULL。PROCESSLIST_HOST:與前臺線程關聯的客戶端的主機名,對于后臺線程為NULL。PROCESSLIST_DB:線程的默認數據庫,如果沒有,則為NULL。PROCESSLIST_COMMAND:對于前臺線程,該值代表著當前客戶端正在執行的command類型,如果是sleep則表示當前會話處于空閑狀態PROCESSLIST_TIME:當前線程已處于當前線程狀態的持續時間(秒)PROCESSLIST_STATE:表示線程正在做什么事情。PROCESSLIST_INFO:線程正在執行的語句,如果沒有執行任何語句,則為NULL。PARENT_THREAD_ID:如果這個線程是一個子線程(由另一個線程生成),那么該字段顯示其父線程IDROLE:暫未使用INSTRUMENTED:線程執行的事件是否被檢測。有效值:YES、NO HISTORY:是否記錄線程的歷史事件。有效值:YES、NO * THREAD_OS_ID:由操作系統層定義的線程或任務標識符(ID): */ select * from threads注意:在performance_schema庫中還包含了很多其他的庫和表,能對數據庫的性能做完整的監控,大家需要參考官網詳細了解。
6、performance_schema實踐操作
基本了解了表的相關信息之后,可以通過這些表進行實際的查詢操作來進行實際的分析。
--1、哪類的SQL執行最多? SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC --2、哪類SQL的平均響應時間最多? SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC --3、哪類SQL排序記錄數最多? SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC --4、哪類SQL掃描記錄數最多? SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC --5、哪類SQL使用臨時表最多? SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC --6、哪類SQL返回結果集最多? SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC --7、哪個表物理IO最多? SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC --8、哪個表邏輯IO最多? SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC --9、哪個索引訪問最多? SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC --10、哪個索引從來沒有用過? SELECT OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME FROM table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA <> 'mysql' ORDER BY OBJECT_SCHEMA,OBJECT_NAME; --11、哪個等待事件消耗時間最多? SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != 'idle' ORDER BY SUM_TIMER_WAIT DESC --12-1、剖析某條SQL的執行情況,包括statement信息,stege信息,wait信息 SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE '%count(*)%'; --12-2、查看每個階段的時間消耗 SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1553; --12-3、查看每個階段的鎖等待情況 SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_longWHERE nesting_event_id = 1553;總結
以上是生活随笔為你收集整理的MYSQL performance schema详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react的bind(this)
- 下一篇: 覆盖索引