MySQL服務器性能剖析

這是我參與更文挑戰的第1天,活動詳情查看: 更文挑戰html

前言

對於服務器性能優化,可能每一個人和每一個人的回答都不同,不一樣場景下,對性能的要求各有各的需求。但若是咱們將響應時間做爲標準,那麼度量性能就變得容易起來。vue

1 剖析服務器負載

慢查詢日誌是開銷最低,精度最高的測量查詢時間的工具。設置long_query_time爲0來捕獲全部的查詢,開啓慢查詢日誌帶來的額外的I/O開銷在IO密集型場景能夠忽略不計,在CPU密集型可能影響還稍微大一些,更須要擔憂日誌可能消耗大量的磁盤空間。 這裏能夠嘗試使用pt-query-digest來查詢優化。www.percona.com/doc/percona…mysql

2 即將過期的剖析單條查詢

進行剖析查詢可使用的有web

SHOW PROFILE;
SHOW PROFILES;
複製代碼

使用 SHOW PROFILES

在navicat裏執行,就能夠看到每次咱們在navicat中查詢一條sql,對應實際上navicat執行了好多條。 先執行sql

SELECT * FROM `ry-vue`.`sys_menu` LIMIT 0, 1000
複製代碼

再執行數據庫

SHOW PROFILES
複製代碼
Query_ID	Duration	Query
1	0.001665	SHOW STATUS
2	0.0013365	SHOW STATUS
3	0.000349	SELECT * FROM `ry-vue`.`sys_menu` LIMIT 0, 1000
4	0.0018455	SHOW STATUS
5	0.0004125	SELECT QUERY_ID, SUM(DURATION) AS SUM_DURATION FROM INFORMATION_SCHEMA.PROFILING GROUP BY QUERY_ID
6	0.00043075	SELECT STATE AS `Status`, ROUND(SUM(DURATION),7) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/0.001340*100,3), '') AS `Percentage` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=2 GROUP BY SEQ, STATE ORDER BY SEQ
7	0.00009075	SET PROFILING = 1
8	0.0013005	SHOW STATUS
9	0.0012965	SHOW STATUS
複製代碼

緣由是由於咱們提交的sql,Navicat除告終果Tab還生成了剖析和狀態兩個Tab性能優化

image.png

剖析Tab這裏有點像針對單條sql作的SHOW PROFILE,可是仍是多了一個佔比。服務器

SHOW PROFILE for query 3;
複製代碼

3 現代化的Performance Schema

SHOW PROFILE;
SHOW PROFILES;
複製代碼

在5.7版本上已通過時了,替代品是Performance Schema 這個庫裏的表markdown

3.1首先將setup_actors 表限制爲將運行查詢的用戶

默認的狀況下,setup_actors配置爲容許對全部前臺線程進行監視和歷史事件收集:工具

SELECT * FROM performance_schema.setup_actors;
+------+------+------+---------+---------+
| HOST | USER | ROLE | ENABLED | HISTORY |
+------+------+------+---------+---------+
| %    | %    | %    | YES     | YES     |
+------+------+------+---------+---------+
複製代碼

把原來的關掉,再添加一條當前用戶的

mysql> UPDATE performance_schema.setup_actors
       SET ENABLED = 'NO', HISTORY = 'NO'
       WHERE HOST = '%' AND USER = '%';

mysql> INSERT INTO performance_schema.setup_actors
       (HOST,USER,ROLE,ENABLED,HISTORY)
       VALUES('localhost','test_user','%','YES','YES');
複製代碼

修改完展現以下

SELECT * FROM performance_schema.setup_actors;
+-----------+-----------+------+---------+---------+
| HOST      | USER      | ROLE | ENABLED | HISTORY |
+-----------+-----------+------+---------+---------+
| %         | %         | %    | NO      | NO      |
| localhost | root      | %    | YES     | YES     |
+-----------+-----------+------+---------+---------+
複製代碼

3.2 經過更新setup_instrumentstable,確保已啓用語句和階段檢測。

mysql> UPDATE performance_schema.setup_instruments
       SET ENABLED = 'YES', TIMED = 'YES'
       WHERE NAME LIKE '%statement/%';

mysql> UPDATE performance_schema.setup_instruments
       SET ENABLED = 'YES', TIMED = 'YES'
       WHERE NAME LIKE '%stage/%';
複製代碼

3.3 確保啓用了events_statements_* 和events_stages_ * 使用者

mysql> UPDATE performance_schema.setup_consumers
       SET ENABLED = 'YES'
       WHERE NAME LIKE '%events_statements_%';

mysql> UPDATE performance_schema.setup_consumers
       SET ENABLED = 'YES'
       WHERE NAME LIKE '%events_stages_%';
複製代碼

3.4 在要監視的帳戶下,運行要分析的語句。

SELECT * FROM `ry-vue`.`sys_menu` LIMIT 0, 1000
複製代碼

3.5 查找執行語句的event_id

SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT
       FROM performance_schema.events_statements_history_long WHERE SQL_TEXT like '%sys_menu%';
EVENT_ID	Duration	SQL_TEXT
225	        0.000624	SELECT * FROM `ry-vue`.`sys_menu` LIMIT 0, 1000
複製代碼

3.6 查詢events_stages_history_longtable 以檢索語句的階段事件。

SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration
       FROM performance_schema.events_stages_history_long WHERE NESTING_EVENT_ID=225;
複製代碼

結果

Stage Duration
stage/sql/starting 0.000066
stage/sql/checking permissions 0.000003
stage/sql/Opening tables 0.000054
stage/sql/init 0.000024
stage/sql/System lock 0.000034
stage/sql/optimizing 0.000002
stage/sql/statistics 0.000009
stage/sql/preparing 0.000006
stage/sql/executing 0.000001
stage/sql/Sending data 0.000347
stage/sql/end 0.000002
stage/sql/query end 0.000017
stage/sql/closing tables 0.000005
stage/sql/freeing items 0.000044
stage/sql/cleaning up 0

總結

本文講解了如何在數據庫中進行語句時間查詢的方法,在它們的幫助下,能夠找出最須要優化的地方,剩下的就要經過調整索引和優化語句來進行語句的調整了。這也是咱們以後會講解的,敬請期待,下篇再見!

相關文章
相關標籤/搜索