高性能mysql阅读笔记(三)服务器性能剖析
性能优化简介
我们可能会听到很多很多的性能指标(qps,吞吐率,cpu利用率等等)
在这里,我们单纯的将性能定义为响应时间,而性能优化即在一定的工作负载下尽可能的降低响应时间。
所以,重中之重即找出时间都花费到了哪些地方,即性能剖析。
性能剖析包括两个步骤
- 测量任务的花费时间
- 对花费时间进行排序
剖析Mysql查询
原著中在此章之前还加了一章对ph应用的性能剖析,由于这里我们只关注mysql,所以感兴趣的可以查看原著(其实是我不懂php哈哈)
mysql的性能剖析包括两方面:
服务器性能剖析
服务端的剖析可以查找到查询慢的查询,从而找到优化点。
服务器的性能剖析依靠查询日志,而慢查询日志可以极大地提高效率
剖析单条查询
通过查询日志定位到需要优化的单条查询后即可对这次查询慢的查询进行剖析:
使用SHOW PROFILE
首先设置启用profile:
SET profiling = 1;
然后当一条查询提交给服务器时,此工具会记录剖析信息到一张临时表,并且给查询赋予一个从1开始的整数标识符。
然后我们使用
SHOW PROFILE FOR QUERY 1;
即可查看第n此查询的信息:
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000068 |
| Executing hook on transaction | 0.000006 |
| starting | 0.000009 |
| checking permissions | 0.000007 |
| Opening tables | 0.000035 |
| init | 0.000006 |
| System lock | 0.000009 |
| optimizing | 0.000005 |
| statistics | 0.000016 |
| preparing | 0.000015 |
| executing | 0.000078 |
| end | 0.000005 |
| query end | 0.000004 |
| waiting for handler commit | 0.000009 |
| closing tables | 0.000008 |
| freeing items | 0.000013 |
| cleaning up | 0.000012 |
+--------------------------------+----------+
17 rows in set, 1 warning (0.00 sec)
里面描述了各个阶段所花费的时间
使用SHOW STATUS
SHOW STATUS命令返回了一些计数器。既有服务器级别的全局计数器,也有基于某个连接的会话级别的计数器。
mysql> show status like 'com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 3 |
+---------------+-------+
1 row in set (0.00 sec)
show status会返回所有操作的计数,我们可以用like来筛选出一些信息,比如以上查看执行查询的次数。
这边列出部分常用的状态信息查看语句:
- 查看MySQL本次启动后的运行时间(单位:秒)
show status like ‘uptime’;
- 查看select语句的执行数
show [global] status like ‘com_select’;
- 查看insert语句的执行数
show [global] status like ‘com_insert’;
- 查看update语句的执行数
show [global] status like ‘com_update’;
- 查看delete语句的执行数
show [global] status like ‘com_delete’;
- 查看试图连接到MySQL(不管是否连接成功)的连接数
show status like ‘connections’;
-查看线程缓存内的线程的数量。
show status like ‘threads_cached’;
- 查看当前打开的连接的数量。
show status like ‘threads_connected’;
-查看当前打开的连接的数量。
show status like ‘threads_connected’;
- 查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。
show status like ‘threads_created’;
- 查看激活的(非睡眠状态)线程数。
show status like ‘threads_running’;
- 查看立即获得的表的锁的次数。
show status like ‘table_locks_immediate’;
- 查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
show status like ‘table_locks_waited’;
- 查看创建时间超过slow_launch_time秒的线程数。
show status like ‘slow_launch_threads’;
- 查看查询时间超过long_query_time秒的查询的个数。
show status like ‘slow_queries’;