前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MySQL】执行计划 explain 及 一条select语句在MySQL中的奇幻之旅

【MySQL】执行计划 explain 及 一条select语句在MySQL中的奇幻之旅

作者头像
看、未来
发布2021-12-20 19:49:28
1.2K0
发布2021-12-20 19:49:28
举报

文章目录

示例

代码语言:javascript
复制
explain select * from emp;
在这里插入图片描述
在这里插入图片描述

解释

列(Column)

含义(Meaning)

id

The SELECT identifier(每个select子句的标识id)

select_type

The SELECT type(select语句的类型)

table

The table for the output row(当前表名)

partitions

The matching partitions (显示查询将访问的分区,如果你的查询是基于分区表)

type

The join type(当前表内访问方式)

possible_keys

The possible indexes to choose(可能使用到的索引)

key

The index actually chosen(经过优化器评估最终使用的索引)

key_len

The length of the chosen key (使用到的索引长度)

ref

The columns compared to the index(引用到的上一个表的列)

rows

Estimate of rows to be examined (要得到最终记录索要扫描经过的记录数)

filtered

Percentage of rows filtered by table condition(存储引擎返回的数据在server层过滤后,剩下满足查询的记录数量的比例)

extra

Additional information (额外的信息说明)

重要字段(我个人认为的)再释义: id:这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是1。如存在子查询或者联合查询这个编号会自增。

type:此列是在优化SQL语句时最需要关注的列之一,此列显示了查询使用了何种类型。 以下排序从最优到最差:

代码语言:javascript
复制
system:表内只有一行数据
const:最多只会有一条记录匹配,常用于主键或者唯一索引为条件查询
eq_ref:当连接使用的索引为主键和唯一时会出现
ref:使用普通索引=或<=> 运算符进行比较将会出现
fulltext:使用全文索引
ref_or_null:跟ref类型类似,只是增加了null值的判断,实际用的不多。语句为where name = ‘kaka’ and name is null,name为普通索引。
index_merge:查询语句使用了俩个以上的索引,常见在使用and、or会出现,官方文档将此类型放在ref_or_null之后,但是在很多的情况下由于读取索引过多性能有可能还不如range
unique_subquery:用于where中的in查询,完全替换子查询,效率更高。语句为value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引
range:索引范围查询,常见于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等运算符的查询中。
index:索引全表扫描,把索引从头到尾扫一遍
all:全表扫描,性能最差。

key:上面写着

rows:这是mysql估算的需要扫描的行数(不是精确值)。这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好。

extra:在大多数情况下会出现以下几种情况。

代码语言:javascript
复制
Using index:使用了覆盖索引,查询列都为索引字段
Using where:使用了where语句
Using temporary :查询结果进行排序的时候使用了一张临时表
Using filesort :对数据使用一个外部的索引排序
Using index condition:使用了索引下推

一条select语句在MySQL中的奇幻之旅

在这里插入图片描述
在这里插入图片描述

注:MySQL8.0起以取消图中第九步(查询缓存)原因:把查询语句作为key ,将结果作为value 进行缓存,一旦这个表有更新,之前所有的缓存都会被清除掉。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 示例
  • 解释
  • 一条select语句在MySQL中的奇幻之旅
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档