`

MYSQL中SQL执行分析

 
阅读更多

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

 

查看SQL的执行情况:

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

 

   mysql> show processlist ;
+----+------+-----------+-------+---------+------+-------+------------------+
| Id | User | Host      | db    | Command | Time | State | Info             |
+----+------+-----------+-------+---------+------+-------+------------------+
| 41 | root | localhost | mysql | Query   |    0 | NULL  | show processlist |
+----+------+-----------+-------+---------+------+-------+------------------+
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打开工具

 

mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)
 

 

2.3准备基础数据

 

create table name
(
id int not null auto_increment,
first_name varchar(30) not null,
last_name  varchar(30) not null,
primary key (id),
index (last_name,first_name)
)

insert into name(first_name,last_name) values("xue","zhaoming")
insert into name(first_name,last_name) values("xue","zhaoyue") 
commit;
select * from name ;
select * from name ;
 

 

2.4 好戏开始了

 

mysql> show profiles;
+----------+------------+----------------------------------------------------------------+
| Query_ID | Duration   | Query                                                          |
+----------+------------+----------------------------------------------------------------+
|        8 | 0.00074500 | insert into name(first_name,last_name) values("xue","zhaoyue") |
|        9 | 0.00021200 | commit                                                         |
|       10 | 0.00063700 | select * from name                                             |
|       11 | 0.00026100 | select * from name  
 

 

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

 

mysql> SHOW PROFILE FOR QUERY 10;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000048 |
| checking query cache for query | 0.000231 |                  ---检查是否在缓存中
| Opening tables                 | 0.000024 |                  ---打开表
| System lock                    | 0.000014 |                  ---锁系统
| Table lock                     | 0.000032 |                  ---锁表 
| init                           | 0.000027 |                  ---初始化
| optimizing                     | 0.000013 |                  ---优化查询
| statistics                     | 0.000019 |
| preparing                      | 0.000018 |                  ---准备
| executing                      | 0.000011 |                  ---执行
| Sending data                   | 0.000075 |
| end                            | 0.000014 |
| query end                      | 0.000010 |
| freeing items                  | 0.000057 |
| storing result in query cache  | 0.000022 |                  ---将结果放到缓存中
| logging slow query             | 0.000010 |                  ---
| cleaning up                    | 0.000012 |
+--------------------------------+----------+
17 rows in set (0.00 sec)
 

 

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

 

mysql> SHOW PROFILE FOR QUERY 11;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000084 |
| checking query cache for query | 0.000028 |
| checking privileges on cached  | 0.000028 |
| sending cached result to clien | 0.000081 |
| logging slow query             | 0.000019 |
| cleaning up                    | 0.000021 |
+--------------------------------+----------+
6 rows in set (0.00 sec)
 

 

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

 

 

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

select * from INFORMATION_SCHEMA.PROFILING where query_id = 11;
 

 

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

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来查看具体的执行计划。

 

mysql> explain select * from name;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | name  | ALL  | NULL          | NULL | NULL    | NULL |    2 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
 

 

 

针对这个会在后面补上一个完整的如何查看计划的文档。

分享到:
评论

相关推荐

    MySQL SQL执行计划分析与优化方案.pptx

    MySQL SQL执行计划分析与优化方案.pptx

    MySQL SQL执行计划分析与优化.pdf

    MySQL SQL执行计划分析与优化.pdf

    Effective MySQL之SQL语句最优化

    《Effective MySQL之SQL语句最优化》是由MySQL专家Ronald Bradford撰著,书 中提供了很多可以用于改进数据库和应用程序性能的最佳实践技巧,并对这些技巧 做了详细的解释。本书希望能够通过一步步详细介绍SQL优化...

    Effective MySQL之SQL语句最优化(高清)

    《Effective MySQL之SQL语句最优化》希望能够通过一步步详细介绍SQL优化的方法,帮助读者分析和调优有问题的SQL语句。 内容简介  《Effective MySQL之SQL语句最优化》主要内容:  ●找出收集和诊断问题必备的分析...

    详解一条sql语句在mysql中是如何执行的

    最近开始在学习mysql相关知识,自己根据学到的知识点,根据自己的理解整理分享出来,本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的。...

    SQL Monitor for Oracle,MySQL和DB2 v2.4.3.6 中文绿色版

    SQL Monitor for Oracle,MySQL and DB2 是款免费的数据库跟踪工具,专门用来分析CPU使用率高的问题。 软件功能: 1. 监控SQL Server的进程和Job,查看当前执行的SQL/命令,并终止之。 2. 对象浏览器,跟 SQL Server...

    SQL优化和SQL执行分析工具Explain的使用详解和示例

    SQL优化 Explain的使用详解 mysql

    支持windows与Linux的web调试工具,支持Mysql日志监控,SQL执行分析,网页与api无刷新性能调试等

    一款免费的同时支持windows与Linux的web调试工具,支持Mysql日志监控,SQL执行分析,网页与api无刷新性能调试,支持网页与api压力测试,支持文件管理,字符串全局搜索替换,支持正则随心匹配,支持代码热编译功能与...

    mysql 显示SQL语句执行时间的代码

    MySQL 的 SQL 語法調整主要都是使用 EXPLAIN , 但是這個並沒辦法知道詳細的 Ram(Memory)/CPU 等使用量. 於 MySQL 5.0.37 以上開始支援 MySQL Query Profiler, 可以查詢到此 SQL 會執行多少時間, 並看出 CPU/Memory ...

    MySQL中通过EXPLAIN如何分析SQL的执行计划详解

    主要给大家介绍了关于MySQL中通过EXPLAIN如何分析SQL的执行计划的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的安康学习价值,需要的朋友们下面随着小编来一起学习学习吧

    sql和MySQL的语句执行顺序分析

    今天遇到一个问题就是mysql中...一、sql执行顺序 (1)from (2) on (3) join (4) where (5)group by(开始使用select中的别名,后面的语句中都可以使用) (6) avg,sum…. (7)having (8) select (9) distinct

    SQL万能查询分析器

    1.由于使用ADO连接,理论支持SQL Server、Access、MySQL、Oracle等所有数据库 2.支持SQL关键词自动提示 3.支持表名自动提示 4.支持表字段自动提示 5.支持SQ关键词、表名、表字段不同颜色显示 6.支持SQL语句注释...

    分析MySQL中优化distinct的技巧

    通过查看执行计划,也为全索引扫描,sql在执行的时候,会对整个服务器带来抖动; root@db 09:00:12>select count(distinct nick) from user_access; +———————-+ | count(distinct nick) | +———————-+...

    SQL智能查询分析器

    1.由于使用ADO连接,理论支持SQL Server、Access、MySQL、Oracle等所有数据库 2.支持SQL关键词自动提示 3.支持表名自动提示 4.支持表字段自动提示 5.支持SQ关键词、表名、表字段不同颜色显示 6.支持SQL语句注释...

    mysql索引和执行计划的使用

    MySQL索引的最佳实践和执行计划的使用分析,包括索引的设计原则,SQL语句的优化原则等

    阿庆SQL智能查询分析器

    1.由于使用ADO连接,理论支持SQL Server、Access、MySQL、Oracle等所有数据库 2.支持SQL关键词自动提示 3.支持表名自动提示 4.支持表字段自动提示 5.支持SQ关键词、表名、表字段不同颜色显示 6.支持SQL语句注释...

    探讨:MySQL中如何查询当前正在运行的SQL语句

    本篇文章是对在MySQL中如何查询当前正在运行的SQL语句进行了详细的分析介绍,需要的朋友参考下

    MySQL+DBA工具库+SQL性能分析工具

    对于任何SQL执行计划的变更,都需要仔细的评估和测试,以确保它不会对数据库和应用程序的性能和稳定性产生负面影响。那么我们通过Statement Outline,Statement Outline是通过支持MySQL8.0官方的所有Hint,结合...

Global site tag (gtag.js) - Google Analytics