MySQL中explain的几点用法

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL里的explain命令内容还是很丰富的,值得好好的挖掘出不少东西来。    本身来说explain就是生成执行计划的内容,如果细看,这个内容和Oracle explain plan for的结果相比还是有差距的。

MySQL里的explain命令内容还是很丰富的,值得好好的挖掘出不少东西来。

   本身来说explain就是生成执行计划的内容,如果细看,这个内容和Oracle explain plan for的结果相比还是有差距的。

   首先是一个比较实际的用法,查询语句我们可以查看执行计划,如果是DML语句呢,他是直接变更了还是只是生成执行计划而已,明白这一点很重要。

explain 生成DML的执行计划

为了进一步的验证,我们选择3个版本,5.5,5.6,5.7来测试。

首先是初始化数据,这个在不同版本是一模一样的方式。

创建一个表test,插入两行数据。

> create table test(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
> insert into test values(1,'aa'),(2,'bb');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0


MySQL 5.5

来看看DML语句的执行计划情况,发现是不支持的。

> explain insert into test values(3,'cc');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into test values(3,'cc')' at line 1
换一个DML比如update,也是不支持的。

> explain update test set name='cc' where id=2;

在此,我们不能得出一个不支持DML的最终结论,我们看看5.6,5.7的结果。


MySQL 5.6
5.6中的结果来看,是支持的,那么最关心的问题,数据会不会变更呢。

> explain insert into test values(3,'cc');
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

查一下数据一目了然。

> select *from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
+------+------+
2 rows in set (0.00 sec)而换一个DML,比如update也是类似的效果。不会直接修改数据。

MySQL 5.7

在5.7中又做了一些改变,那就是对于DML的支持更加完善了,你可以通过语句的执行计划可以很清晰的看到是哪一种类型的DML(insert,update,delete),当然insert的执行计划有些鸡肋,因为实在没什么好处理的了。

> explain insert into test values(3,'cc');
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | INSERT      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

那看看update的执行计划,可以看出,在当前的表结构情况下,这个语句的执行效率还是十分有限。

> explain update test set name='cc' where id=2;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | UPDATE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+很明显,这个过程是不会修改数据的。

> select *from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
+------+------+

explain for connection的新特性

如果对于explain开始有了一些感觉,那么我们再来看一个5.7中的新特性,那就是对connection的解析,也就是explain for connection特性。

  我们假设一个场景,有一个SQL语句执行效率很差,我们通过show processlist可以看到,但是语句的效率为什么这么差呢,一个行之有效的分析问题的方法就是查看执行计划,好了,回到问题的核心,那就是怎么得到语句的执行计划,这个如果我们按照现有问题的处理方式,那就是查看慢日志,然后再解析。或者使用第三方的工具,来得到一些效果更好一些的报告。

   比较纠结的一种情况,就是你看到语句的执行效率很差,但是这么一个过程下来少说也有几分钟,等你快解析出来的时候,发现语句已经返回了。所以实时抓取数据是提升DBA幸福度的一大利器。那我们就模拟一个性能较差的SQL,比如下面的反连接语句,执行效率很差。我们来试着抓取一下执行计划。

> select account
  from t_fund_info
 where money >= 300
   and account not in (select distinct (account)
                         from t_user_login_record
                        where add_time >= '2016-06-01');

我们通过mysqladmin pro的方式抓取会话的情况,类似于show processlist的结果,可以很明显看到第一列就是connection id  6346185,我们解析一下这个connection

# mysqladmin pro|grep t_fund_info
| 6346185 | root            | localhost                   | test           | Query       | 8       | Sending data                                                  | select account   from t_fund_info  where money >= 300  and account not in (select distinct (account) | 0         | 0             |

查看执行计划的情况如下:

> explain for connection 6346185;
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------
| id | select_type | table               | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------
|  1 | PRIMARY     | t_fund_info         | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1826980 |   100.00
|  2 | SUBQUERY    | t_user_login_record | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1740589 |    33.33
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------这样一来就可以得到一个基本的执行计划了,对于分析问题来说还是有一定的效率提升。





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
30天前
|
SQL 关系型数据库 MySQL
mysql结果垂直显示-\g和\G的用法
mysql结果垂直显示-\g和\G的用法
27 0
|
1月前
|
SQL 缓存 关系型数据库
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
66 0
|
1月前
|
存储 安全 关系型数据库
MySQL 临时表的用法和特性
MySQL 临时表的用法和特性
|
2月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表6、查询优化——1、EXPLAIN命令的使用——2、索引优化
MySQL技能完整学习列表6、查询优化——1、EXPLAIN命令的使用——2、索引优化
22 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql SQL的一些特殊用法记录
1、查询group by having 中having不起作用,及解决
15 0
|
2月前
|
SQL 存储 关系型数据库
MySQL - Explain详解
MySQL - Explain详解
|
3月前
|
SQL 关系型数据库 MySQL
MySQL SQL性能分析 慢查询日志、explain使用
MySQL SQL性能分析 慢查询日志、explain使用
106 0
|
3月前
|
SQL 机器学习/深度学习 关系型数据库
MySQL - Explain深度剖析
MySQL - Explain深度剖析
43 0
|
4月前
|
SQL 关系型数据库 MySQL
mysql explain 详解及sql优化指南
mysql explain 详解及sql优化指南
31 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL知识汇总:MySQL函数CASE WHEN用法详解
MySQL知识汇总:MySQL函数CASE WHEN用法详解