千家信息网

MySQL中explain如何使用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章将为大家详细讲解有关MySQL中explain如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先是一个比较实际的用法,查询语句我们可以
千家信息网最后更新 2026年11月02日MySQL中explain如何使用

这篇文章将为大家详细讲解有关MySQL中explain如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

首先是一个比较实际的用法,查询语句我们可以查看执行计划,如果是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
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------

关于MySQL中explain如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

语句 就是 数据 情况 效率 支持 问题 方式 特性 结果 明显 内容 效果 文章 更多 版本 知识 篇文章 过程 还是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 鸠鸠互联网科技 致聘互联网科技 伴你行互联网科技有限公司 互联网养老 桔豆科技 甘肃拓世互联网科技有限公司 创业天下互联网科技有限公司 互联网科技产业特征 速维有品互联网信息科技(苏州)有限公司 翼展科技 首家互联网医院 世界互联网领先科技成果获奖 富国互联网金融科技混合基金 本届互联网大会上的黑科技 有人说阿里系是互联网科技企业 神州科技互联网有限公司 九思连强互联网电子科技有限公司 广州梦谷互联网科技有限公司领导 互联网科技机房 科技信息时代互联网发展 第三届互联网大会安防黑科技 互联网科技名片 互联网下的科技发展 科技与互联网发展 紫鲸互联网科技 互联网金融科技创新 互联网科技ppt模板 上游互联网科技 知域互联网科技有限公司大骗子 健康食品互联网创新科技园项目 阿里互联网科技企业
0