剖析单条查询()
在定位到需要优化的单条查询后可以针对此查询钻取更多的信息确认为什么会花费这么长的时间执行以及需要如何去优化关于如何优化查询的技术将在本书后续的一些章节讨论在此之前还需要介绍一些相关的背景知识本章的主要目的是介绍如何方便地测量查询执行的各部分花费了多少时间有了这些数据才能决定采用何种优化技术
不幸的是MySQL 目前大多数的测量点对于剖析查询都没有什么帮助当然这种状况正在改善但在本书写作之际大多数生产环境的服务器还没有使用包含最新剖析特性的版本所以在实际应用中除了SHOW STATUSSHOW PROFILE检查慢查询日志的条目(这还要求必须是Percona Server官方MySQL 版本的慢查询日志缺失了很多附加信息)这三种方法外就没有什么更好的办法了下面将逐一演示如何使用这三种方法来剖析单条查询看看每一种方法是如何显示查询的执行情况的
使用SHOW PROFILE
SHOW PROFILE 命令是在MySQL 以后的版本中引入的来源于开源社区中的JeremyCole 的贡献这是在本书写作之际唯一一个在GA 版本中包含的真正的查询剖析工具默认是禁用的但可以通过服务器变量在会话(连接)级别动态的修改
mysql> SET profiling = ;
然后在服务器上执行的所有语句都会测量其耗费的时间和其他一些查询执行状态变更相关的数据这个功能有一定的作用而且最初的设计功能更强大但未来版本中可能会被Performance Schema 所取代尽管如此这个工具最有用的作用还是在语句执行期间剖析服务器的具体工作
当一条查询提交给服务器时此工具会记录剖析信息到一张临时表并且给查询赋予一个从开始的整数标识符下面是对Sakila样本数据库的视图的剖析结果
mysql> SELECT * FROM sakilanicer_but_slower_film_list;
[query results omitted]
rows in set ( sec)
该查询返回了 行记录花费了大概/ 秒下面看一下SHOW PROFILES 有什么结果
mysql> SHOW PROFILES;
++++
| Query_ID | Duration | Query |
++++
| | | SELECT * FROM sakilanicer_but_slower_film_list |
++++
首先可以看到的是以很的精度显示了查询的响应时间这很好MySQL客户显示的时间只有两位小数对于一些执行得很快的查询这样的精度是不够的下面继续看接下来的输出
mysql> SHOW PROFILE FOR QUERY ;
+++
| Status | Duration |
+++
| starting | |
| Opening tables | |
| System lock | |
| Table lock | |
[] []