注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

淘尽网 官方博客

淘尽网http://www.tao3w.com做最好的比价网站

 
 
 

日志

 
 
关于我

淘尽网 http://www.tao3w.com 做最好的比价网站,做最好的数据抓取专家。

网易考拉推荐

MYSQL中SQL执行分析(转)  

2016-01-22 14:40:33|  分类: MYSQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://inter12.iteye.com/blog/1420789

今天本来想看下mysql的一条语句在MYSQL引擎中是如何的处理,无意中发现了很多其他的东西,就整理下吧。

 

查看SQL的执行情况:

1.通过show processlist 来查看系统的执行情况!

 

Sql代码  收藏代码
  1.    mysql> show processlist ;  
  2. +----+------+-----------+-------+---------+------+-------+------------------+  
  3. | Id | User | Host      | db    | Command | Time | State | Info             |  
  4. +----+------+-----------+-------+---------+------+-------+------------------+  
  5. | 41 | root | localhost | mysql | Query   |    0 | NULL  | show processlist |  
  6. +----+------+-----------+-------+---------+------+-------+------------------+  
  7. 1 row in set (0.00 sec)  
 

 

该命令一般用于实时的去查看系统中运行较慢的SQL。

 

2.通过profiling来进行查看

这个命令是查看SQL的执行时间,能很直观的看出快慢。

 

2.1查看系统值:0代表还是关闭着分析功能

mysql> select @@profiling;

+-------------+

| @@profiling |

+-------------+

|           0 |

+-------------+

1 row in set (0.00 sec)

 

2.2打开工具

 

Sql代码  收藏代码
  1. mysql> set profiling=1;  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. mysql> select @@profiling;  
  5. +-------------+  
  6. | @@profiling |  
  7. +-------------+  
  8. |           1 |  
  9. +-------------+  
  10. 1 row in set (0.00 sec)  
 

 

2.3准备基础数据

 

Sql代码  收藏代码
  1. create table name  
  2. (  
  3. id int not null auto_increment,  
  4. first_name varchar(30) not null,  
  5. last_name  varchar(30) not null,  
  6. primary key (id),  
  7. index (last_name,first_name)  
  8. )  
  9.   
  10. insert into name(first_name,last_name) values("xue","zhaoming")  
  11. insert into name(first_name,last_name) values("xue","zhaoyue")   
  12. commit;  
  13. select * from name ;  
  14. select * from name ;  
 

 

2.4 好戏开始了

 

Sql代码  收藏代码
  1. mysql> show profiles;  
  2. +----------+------------+----------------------------------------------------------------+  
  3. | Query_ID | Duration   | Query                                                          |  
  4. +----------+------------+----------------------------------------------------------------+  
  5. |        8 | 0.00074500 | insert into name(first_name,last_name) values("xue","zhaoyue") |  
  6. |        9 | 0.00021200 | commit                                                         |  
  7. |       10 | 0.00063700 | select * from name                                             |  
  8. |       11 | 0.00026100 | select * from name    
 

 

通过上面的大家可以很清晰的看到在执行两边的select * from name语句的时候实际执行的效率是不一样。那么我们来具体看看为什么不一样的。

 

Java代码  收藏代码
  1. mysql> SHOW PROFILE FOR QUERY 10;  
  2. +--------------------------------+----------+  
  3. | Status                         | Duration |  
  4. +--------------------------------+----------+  
  5. | starting                       | 0.000048 |  
  6. | checking query cache for query | 0.000231 |                  ---检查是否在缓存中  
  7. | Opening tables                 | 0.000024 |                  ---打开表  
  8. | System lock                    | 0.000014 |                  ---锁系统  
  9. | Table lock                     | 0.000032 |                  ---锁表   
  10. | init                           | 0.000027 |                  ---初始化  
  11. | optimizing                     | 0.000013 |                  ---优化查询  
  12. | statistics                     | 0.000019 |  
  13. | preparing                      | 0.000018 |                  ---准备  
  14. | executing                      | 0.000011 |                  ---执行  
  15. | Sending data                   | 0.000075 |  
  16. | end                            | 0.000014 |  
  17. | query end                      | 0.000010 |  
  18. | freeing items                  | 0.000057 |  
  19. | storing result in query cache  | 0.000022 |                  ---将结果放到缓存中  
  20. | logging slow query             | 0.000010 |                  ---  
  21. | cleaning up                    | 0.000012 |  
  22. +--------------------------------+----------+  
  23. 17 rows in set (0.00 sec)  
 

 

具体的查询过程如上面所示,那么为什么第二次的查看就快了呢?简单,看下第二次的查询信息

 

Sql代码  收藏代码
  1. mysql> SHOW PROFILE FOR QUERY 11;  
  2. +--------------------------------+----------+  
  3. | Status                         | Duration |  
  4. +--------------------------------+----------+  
  5. | starting                       | 0.000084 |  
  6. | checking query cache for query | 0.000028 |  
  7. | checking privileges on cached  | 0.000028 |  
  8. | sending cached result to clien | 0.000081 |  
  9. | logging slow query             | 0.000019 |  
  10. | cleaning up                    | 0.000021 |  
  11. +--------------------------------+----------+  
  12. rows in set (0.00 sec)  
 

 

对比两个执行过程,我们可以很清晰的看到为什么第二次的查看快了,因为是直接从缓存中查找数据了。

 

 

以上具体的信息都是从 INFORMATION_SCHEMA.PROFILING 这张表中取得的。这张表记录了所有的各个步骤的执行时间及相关信息。若是希望得到所有的执行结果。

Java代码  收藏代码
  1. select * from INFORMATION_SCHEMA.PROFILING where query_id = 11;  
 

 

查看一次查询消耗的总时间:

Java代码  收藏代码
  1. select min(seq), sum(duration) from information_schema.profiling where query_id = 2  

 

3.查看slow_log表 + mysqldumpslow 工具查看慢日志

内容以后再补上。详细的说明可以看下面的文档:

http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

 

 

4.第三方工具了

这个就是自己写脚本来监控了,可以采用perl来搞。

 

5.还有就是用explain来查看具体的执行计划。

 

Sql代码  收藏代码
  1. mysql> explain select * from name;  
  2. +----+-------------+-------+------+---------------+------+---------+------+------+-------+  
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |  
  4. +----+-------------+-------+------+---------------+------+---------+------+------+-------+  
  5. |  1 | SIMPLE      | name  | ALL  | NULL          | NULL | NULL    | NULL |    2 |       |  
  6. +----+-------------+-------+------+---------------+------+---------+------+------+-------+  
  7. 1 row in set (0.00 sec) 
  评论这张
 
阅读(71)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017