3.3 剖析MySQL查询

捕获MySQL的查询到日志文件中

通过设置long_query_time为0来捕获所有的查询。

pt-query-digest是分析MySQL查询日志最有力的工具。
一般情况下,只需要将慢查询日志文件作为参数传递给pt_query_digest,就可以正确地工作了。它会将查询的剖析报告打印出来,并且能够选择将“重要”的查询逐条打印出更详细的信息。

3.3.2 剖析单条件查询

在定位到需要优化的查询后,可以针对次查询“钻取”更多的信息,确认为什么会花费这么长时间执行,以及需要如何去优化。
有三种方法可以剖析单条查询:SHOW STATUS、SHOW PROFILE、检查慢查询日志的条目

使用 SHOW PROFILE

默认是禁用的,可以通过服务器变量在会话(连接)级别动态地修改。

  1. set profiling = 1;

然后在服务器上执行所有的语句,都会测量其耗费的时间和其他一些查询执行状态变更的相关的数据。这个功能有一定的作用,而且最初的设计功能更强大,但未来的版本中可能会被Performance Sshema所取代。尽管如此,这个工具最有用的作用还是在语句执行期间剖析服务器的具体工作。
当一条查询提交给服务器时,此工具会记录剖析信息到一张临时表,并且给查询赋予从1开始的整数标识符,
**

  1. SELECT * FROM sakila.`nicer_but_slower_film_list` ;
  2. SHOW PROFILES ;

image.png
对于一些执行得很快的查询这样的精度是不够的,如下

  1. SHOW PROFILE FOR QUERY 1;

image.png

剖析报告给出了查询执行的每个步骤花费的时间,看结果很难快速地确定哪个步骤花费。因为输出是按照执行顺序排序,而不是按照花费的时间排序的。可以直接查询

  1. SET @query_id = 1;
  2. SELECT
  3. STATE,
  4. SUM (duration) AS Total_r,
  5. ROUND (
  6. 100 * SUM (duration) /
  7. (SELECT
  8. SUM (duration)
  9. FROM
  10. information_schema.`PROFILING`
  11. WHERE query_id = @query_id),
  12. 2
  13. ) AS Pct_R,
  14. COUNT (*) AS Calls,
  15. SUM (duration) / COUNT (*) AS "R/Call"
  16. FROM
  17. information_schema.`PROFILING`
  18. WHERE query_id = @query_id
  19. GROUP BY state
  20. ORDER BY Total_r DESC ;

使用SHOW STATUS

MySQL的SHOW STATUS命令返回了一些计数器。既有服务器级别的全局计数器,也有基于某个连接的会话级别的计数器。