這是我參與更文挑戰的第1天,活動詳情查看: 更文挑戰html
對於服務器性能優化,可能每一個人和每一個人的回答都不同,不一樣場景下,對性能的要求各有各的需求。但若是咱們將響應時間做爲標準,那麼度量性能就變得容易起來。vue
慢查詢日誌是開銷最低,精度最高的測量查詢時間的工具。設置long_query_time爲0來捕獲全部的查詢,開啓慢查詢日誌帶來的額外的I/O開銷在IO密集型場景能夠忽略不計,在CPU密集型可能影響還稍微大一些,更須要擔憂日誌可能消耗大量的磁盤空間。 這裏能夠嘗試使用pt-query-digest來查詢優化。www.percona.com/doc/percona…mysql
進行剖析查詢可使用的有web
SHOW PROFILE;
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性能優化
剖析Tab這裏有點像針對單條sql作的SHOW PROFILE,可是仍是多了一個佔比。服務器
SHOW PROFILE for query 3;
複製代碼
SHOW PROFILE;
SHOW PROFILES;
複製代碼
在5.7版本上已通過時了,替代品是Performance Schema 這個庫裏的表markdown
默認的狀況下,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 |
+-----------+-----------+------+---------+---------+
複製代碼
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/%';
複製代碼
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_%';
複製代碼
SELECT * FROM `ry-vue`.`sys_menu` LIMIT 0, 1000
複製代碼
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
複製代碼
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 |
本文講解了如何在數據庫中進行語句時間查詢的方法,在它們的幫助下,能夠找出最須要優化的地方,剩下的就要經過調整索引和優化語句來進行語句的調整了。這也是咱們以後會講解的,敬請期待,下篇再見!