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

总结

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

相关文章
相关标签/搜索