`

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 执行计划分析与优化方案 MySQL SQL 执行计划分析与优化方案是数据库性能优化的关键步骤。通过分析 SQL 执行计划,可以了解 MySQL 是如何执行查询的,并且可以根据执行计划来优化查询性能。下面将对 MySQL...

    navicat for mysql执行sql脚本细节

    通过上述分析可以看出,在Navicat for MySQL中执行SQL脚本时,正确的配置选项对于确保脚本的顺利执行至关重要。了解和掌握这些细节可以帮助开发者更加高效地管理数据库,减少因配置不当导致的数据丢失或损坏风险。...

    MySql中执行SQL文件.rar

    在MySQL数据库管理中,执行SQL文件是常见的任务,特别是在数据导入、备份恢复或者数据库初始化时。这个名为"MySql中执行SQL文件.rar"的压缩包很可能包含了一个或多个SQL脚本,用于实现这样的操作。让我们详细了解...

    用于将大型MySQL转储拆分为可独立执行的小型SQL文件

    这个工具专门设计用于将大型的MySQL转储文件拆分成多个小文件,每个小文件包含可以独立执行的SQL语句,从而提高了数据库操作的效率和灵活性。 SQLDumpSplitter的核心功能是智能分析和分割SQL转储文件。它能够识别...

    Oracle Sql语句转换成Mysql Sql语句

    OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,分析其结构,并根据MySQL的语法规则进行转换,然后将转换后的SQL语句保存到指定的目标文件中。这个工具简化了手动...

    数据库转换工具MySQL 转为SqlServer 脚本

    在MySQL到SQL Server的转换中,确保数据完整性、业务连续性和最小化停机时间至关重要。 2. **工具选择**:市场上有许多工具可以帮助进行这种迁移,如Microsoft SQL Server Migration Assistant (SSMA) for MySQL,...

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

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

    Effective MySQL之SQL语句最优化.pdf

    尽管如此,我将基于标题和描述中提供的关键词“Effective MySQL之SQL语句最优化”来构建知识点。 1. SQL语句最优化的概念:在数据库管理中,对SQL语句进行优化是提高数据库性能的关键环节。最优化的SQL语句能够在...

    mysql深度学习者 MySQL架构与SQL执行流程

    MySQL 架构与 SQL 执行流程深入浅出 MySQL 架构与 SQL 执行流程是 MySQL 数据库的核心组件,它们之间的交互关系决定了 MySQL 数据库的性能和可靠性。本篇文章将深入浅出 MySQL 架构和 SQL 执行流程,帮助读者更好...

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

    MySQL SQL执行计划分析与优化是数据库管理员和开发人员必备的技能之一,它涉及到如何高效地查询和操作数据。本资料由徐春阳在2019年的DTCC数据库大会上分享,主要探讨了如何理解和优化SQL查询的执行计划。 1. **读...

    MySQL全量SQL分析与审计平台介绍.pptx

    该平台能够实时监控数据库性能,提供SQL执行详情、性能趋势、慢查询分析等功能,帮助DBA快速定位问题并进行优化。 数据采集服务负责从MySQL实例中获取Performance Schema的数据,这可能涉及到定期轮询或者利用...

    MySQL线上SQL捕获及分析

    首先,SQL执行的过程包括客户端发送请求、服务器解析、执行计划生成、数据读取与返回等多个步骤。为了优化,我们需要获取到实际运行在生产环境中的SQL列表。常用的捕获方法有三种: 1. **基于tcpdump线上SQL抓取**...

    MySQL迁移SQLServer工具

    1. **分析阶段**:SSMA会扫描MySQL数据库的架构,包括表、视图、存储过程、触发器等,并生成相应的SQL Server兼容脚本。 2. **转换阶段**:工具将MySQL的语法转换为SQL Server的T-SQL语法,确保数据和结构能在目标...

    MySQL开发者SQL权威指南_MYSQL_

    MySQL开发者SQL权威指南是一本专为MySQL开发人员设计的详细参考书籍,旨在帮助读者深入理解和掌握SQL语言在MySQL环境中的应用。MySQL是一种广泛使用的开源关系型数据库管理系统,它以其高效、稳定和易用性赢得了全球...

    mysql的sql优化

    首先,理解SQL执行原理是优化的基础。MySQL采用解析、优化、执行三个步骤来处理SQL语句。解析阶段会检查语法和权限;优化阶段会选择最佳的执行计划,包括决定表的读取顺序、是否使用索引等;执行阶段则是按照计划...

    基于MySQL的SQL注入攻击

    SQL注入(SQL Injection,简称SQLi)是一种常见的网络安全攻击方式,攻击者通过将恶意SQL代码插入到应用程序的输入字段中,利用应用程序对用户输入数据处理的不当,迫使应用程序执行非预期的SQL命令,从而获取敏感...

    一款数据库连接工具,可用于连接Mysql做sql执行,数据处理

    本篇文章将深入探讨SQLyog的使用,以及如何借助它来连接MySQL数据库进行SQL执行和数据处理。 首先,SQLyog提供了直观的用户界面,允许用户轻松地连接到MySQL服务器。在使用前,你需要确保已经安装了MySQL服务器,...

    通过分析SQL语句的执行计划优化SQL(总结)

    在不同的数据库系统中,如MySQL、Oracle、SQL Server等,都有相应的命令或工具用于查看SQL语句的执行计划,例如SQL Server的`SET SHOWPLAN_ALL`或`SET SHOWPLAN_TEXT`,Oracle的`EXPLAIN PLAN`。 4. **执行计划的...

    mysql数据库转换成SQLserver工具包

    1. 数据库结构转换:工具首先分析MySQL的表结构,包括字段名、字段类型、键约束(主键、外键等)、索引等,然后在SQL Server中创建相应的表结构。 2. 数据迁移:将MySQL中的记录逐条读取并写入到SQL Server中,确保...

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

    ### SQL优化与SQL执行分析工具Explain的使用详解 #### 一、SQL优化的重要性 SQL优化一直是数据库领域的重要话题,特别是在大数据量处理和高并发访问的场景下,优化后的SQL查询能够显著提升系统的响应速度和资源...

Global site tag (gtag.js) - Google Analytics