mysql explain insert_MySQL之EXPLAIN 执行计划详解
explain 可以分析 select语句的执行,即 MySQL 的“执行计划。
一、type 列
MySQL 在表里找到所需行的方式。包括(由左至右,由最差到最好):| All | index | range | ref | eq_ref | const,system | null |
ALL(所有)
全表扫描,MySQL 从头到尾扫描整张表查找行。
mysql> explain select * froma\G
...
type:ALL如果加上 limit 如select * from a limit 100 MySQL 会扫描 100行,但扫描方式不会变,还是从头到尾扫描。index(索引)
根据索引来读取数据,如果索引已包含了查询数据,只需扫描索引树,否则执行全表扫描和All类似;create table a(a_id int not null, key(a_id));insert into a value(1),(2);
mysql> explain select a_id froma\G
...
type:indexrange(范围)
以范围的形式扫描索引
建表:create table a(a_id int not null, key(a_id));insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
mysql> explain select * from a where a_id > 1\G
...
type: range
...IN比较符也会用 range 表示:
mysql> explain select * from a where a_id in (1,3,4)\G
...
type: range
...
`
ref(引用)
非唯一性索引访问
建表:create table a(a_id int not null, key(a_id));insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
mysql> explain select * from a where a_id=1\G
...
type: ref
...
eq_ref(等值引用)
使用有唯一性索引查找(主键或唯一性索引)
建表及插入数据:create table a(id int primary key);create table a_info(id int primary key, title char(1));insert into a value(1),(2);insert into a_info value(1, 'a'),(2, 'b');
mysql> explain select * from a joina_info using(id);
...+--------+--------+...
...| table | type |...
...+--------+--------+...
...| a | index |...
...| a_info | eq_ref |...
...+--------+--------+...
此时 a_info 每条记录与 a 一一对应,通过主键 id 关联起来,所以 a_info 的 type 为 eq_ref。
删除 a_info 的主键:ALTER TABLE `a_info` DROP PRIMARY KEY;
现在 a_info 已经没有索引了:
mysql> explain select * from a joina_info using(id);+----+...+--------+--------+...
| id |...| table | type |...+----+...+--------+--------+...
| 1 |...| a_info | ALL |...| 1 |...| a | eq_ref |...+----+...+--------+--------+...
这次 MySQL 调整了执行顺序,先全表扫描 a_info 表,再对表 a 进行 eq_ref 查找,因为 a 表 id 还是主键。
删除 a 的主键:alter table a drop primary key;
现在 a 也没有索引了:
mysql> explain select * from a joina_info using(id);
...+--------+------+...
...| table | type |...
...+--------+------+...
...| a | ALL |...
...| a_info | ALL |...
...+--------+------+...
现在两个表都使用全表扫描了。
建表及插入数据:create table a(id int primary key);create table a_info(id int, title char(1), key(id));insert into a value(1),(2);insert into a_info value(1, 'a'),(2, 'b');
现在 a_info 表 id 列变为普通索引(非唯一性索引):
mysql> explain select * from a join a_info using(id) where a.id=1;
...+--------+-------+...
...| table | type |...
...+--------+-------+...
...| a | const |...
...| a_info | ref |...
...+--------+-------+...
a_info 表 type 变为 ref 类型了。
所以,唯一性索引才会出现 eq_ref (非唯一性索引会出现 ref ),因为唯一,所以最多只返回一条记录,找到后无需继续查找,因此比 ref 更快。
const(常量连接)
被称为“常量”,这个词不好理解,不过出现 const 的话就表示发生下面两种情况:
在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。返回值直接放在 select 语句中,类似 select 1 ASf 。可以通过 extended 选择查看内部过程:
建表及插入数据:create table a(id int primary key, c1 char(20) not null, c2 text not null, c3 text not null);insert into a values(1, 'asdfasdf', 'asdfasdf', 'asdfasdf'), (2, 'asdfasdf', 'asdfasdf', 'asdfasdf');
mysql> explain extended select * from a where id=1\G
...
type: const
possible_keys:PRIMARY
key: PRIMARY...
用 show warnings 查看 MySQL 是如何优化的:
mysql>show warnings\G
...
Message:select '1' AS `id`,'asdfasdf' AS `c1`,'asdfasdf' AS `c2`,'asdfasdf' AS`c3`from `test`.`a` where 1查询返回的结果为:
mysql> select * from a where id=1;+----+----------+----------+----------+
| id | c1 | c2 | c3 |
+----+----------+----------+----------+
| 1 | asdfasdf | asdfasdf | asdfasdf |
+----+----------+----------+----------+
可以看出,返回结果中的字段值都以“值 AS 字段名”的形式直接出现在优化后的 select语句中。
修改一下查询:
mysql> explain select * from a where id in(1,2)\G
...
type: range
...
当返回结果超过1条时, type 便不再为 const 了。
重新建表及插入数据:create table a (id int not null);insert into a value(1),(2),(3);
mysql> explain select * from a where id=1\G
...
type:ALL目前表中只有一条 id=1 的记录,但 type 已为 ALL,因为只有唯一性索引才能保证表中最多只有一条记录,只有这样 type 才有可能为 const 。
为 id 加普通索引后, type 变为 ref ,改为加唯一或主键索引后, type 便变为 const 了。
二、Extra 列
Extra表示附加信息,常见的有如下几种(也按查询效率从高到低排列):
Usingindex:表示使用索引,如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个叫覆盖索引。如果同时出现Using where,代表使用索引来查找读取记录, 也是可以用到索引的,但是需要查询到数据表。
Usingwhere:表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where。如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询:返回所有数据。
Using filesort:不是“使用文件索引”的含义!filesort是MySQL所实现的一种排序策略,通常在使用到排序语句ORDER BY的时候,会出现该信息。
Usingtemporary:表示为了得到结果,使用了临时表,这通常是出现在多表联合查询,结果排序的场合。
如果EXPLAIN出现后面两个信息(Using filesort,Usingtemporary),而rows又比较大,通常意味着你需要调整查询语句,或者需要添加索引,总之需要尽量消除这两个信息。
转自:http://blog.csdn.net/xtdhqdhq/article/details/20377273
mysql explain insert_MySQL之EXPLAIN 执行计划详解相关推荐
- MySQL 优化:Explain 执行计划详解
昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一个工作6年的程序员, ...
- Explain执行计划详解
作者:IT王小二 博客:https://itwxe.com 一条查询 SQL 语句为什么会执行很慢?执行的时候走了什么索引?多表查询的时候 SQL 大体执行流程是怎么样的?Explain 执行计划详解 ...
- Explain 执行计划详解
什么是执行计划 我们往往通过慢查询日志,可以找到慢查询的sql具体是怎么写的.我们往往可以通过表的索引,执行引擎等等去自己判断sql为什么执行缓慢的原因.但是这明显不是高效的. 我们的MySQL中为我 ...
- MySQL系列---架构与SQL执行流程详解
文章目录 1. 背景 2. 架构体系 2.1 架构图 2.2 模块详解 2.3 架构分层 3. 查询SQL语句执行流程 3.1 连接 3.1.1 MySQL支持的通信协议 3.1.2 通信方式 3.2 ...
- impala 执行计划详解
Impala是一个MPPMassivelyParallelProcessing计算引擎,简单来说就是将计算压力分到多个节点,得到结果后汇总,然后再返回给客户端.如果你留意过Impala的执行计划,会观 ...
- MySQL高级 之 explain执行计划详解
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...
- Mysql调优之explain执行计划详解
前言 explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了 explai ...
- mysql和oracle执行计划_mysql explain执行计划详解
原文链接:https://www.cnblogs.com/xiaoboluo768/p/5400990.html mysql> explain select t1.kprq from p ...
- mysql 执行计划详解_mysql explain执行计划详解
备注:转载 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:si ...
最新文章
- 4.04Day14递推、三元表达式、列表/字典推导式、匿名函数
- TensorFlow 运行官方文档中文版 简单例子出现:IndentationError:unexpected indent
- 程序员基本功05表达式中的陷阱
- 误删了microsoft visual c++后如何正常运行matlab
- MongoDB实战指南(二):索引与查询优化
- python二维数组换行输出_关于用python绘制二维数组的问题
- 第三部分 虚拟机执行子系统
- springboot日志管理_最近Springboot有点火,只是因为面试问的频率高吗?
- 任务管理三部曲 - 模板使用说明(超实用模板下载)
- Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
- 为什么很多互联网公司喜欢招应届毕业生?
- Oracle ERP系统借贷关系表
- uniapp nvue页面 关闭输入法
- html网页注册信息不完全时有警示_如何提升网页的用户体验?
- 《MATLAB SYNTAX》第4章 多项式
- 2021韩顺平图解linux
- 3种常见的数据库迁移同步工具对比,哪个更适合你?
- Android QQ 登录接入详细介绍
- 网易企业邮箱:三道防御、七项措施,切实保障企业邮箱安全【企业邮箱申请】
- i.MX RT开发笔记-03 | i.MX RT1062地址空间映射及启动方式
热门文章
- ZYNQ中断示例修改
- python能开发手机程序吗_python能否开发安卓应用app?当然可以,python助你轻松搞定...
- visual 对话框之间调用_两套S71200之间实现S7通讯的方法
- 2.2.2 操作系统之进程调度的时机(主动放弃与被动放弃)、切换与过程(广义与狭义)、方式(非剥夺与剥夺)
- java输出文件中匹配的字段_Java如何从文件中打印与给定模式匹配的所有字符串?...
- 域名系统DNS、文件传送协议FTP、动态主机配置协议DHCP、远程登录协议TELNET、电子邮件协议(SMTP/POP3/IMAP)、常用端口
- 在win10下面新建一个虚拟网卡
- linux可以生成pdb调试信息吗,Linux通过使用pdb简单调试python计划
- 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
- alpinestars与丹尼斯_胖摩的骑行路 篇四:真的值到了—丹尼斯MOTORSHOE AIR骑行靴...