这是我参与更文挑战的第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 |
本文讲解了如何在数据库中进行语句时间查询的方法,在它们的帮助下,能够找出最须要优化的地方,剩下的就要经过调整索引和优化语句来进行语句的调整了。这也是咱们以后会讲解的,敬请期待,下篇再见!