| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【开发日记】MySQL-Explain学习日记 -> 正文阅读 |
|
[大数据]【开发日记】MySQL-Explain学习日记 |
Explain前言本文使用的MySQL数据库版本为 参考的官方文档链接如下: MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format 作用用来查看MySQL是如何执行语句的信息,使用这个关键字并不会执行这条SQL语句;
使用方式
如:
执行结果1、
|
类型 | 说明 |
---|---|
SIMPLE | 简单查询。查询不包含子查询和union。 |
PRIMARY | 复杂查询中最外层的select。 |
SUBQUERY | 包含在select中的子查询(不在from子句中) |
DERIVED | 包含在from子句中的子查询。 |
table
列表示行数据引用的表的名称。还有其他出现的情况可以参考:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_table
partitions
列版本5.7以前,该项是EXPLAIN PARTITIONS
显示的选项,5.7以后成为了默认选项;该列显示的为分区表命中的分区情况;非分区表该字段为NULL;
type
列这一列表示访问类型,决定MySQL如何查找表中的行,查找数据行记录的大概范围。
常见的结果从优到差依次为:
system
> const
> eq_ref
> ref
> range
> index
> ALL
一般来说,需要保证起码达到range级别,最好达到ref;其他的不常见的结果值请查看官方说明文档,这里只列举常见的。
类型 | 说明 |
---|---|
system | 该表只有一行,这里是const 类型的特例。 |
const | 表示该表最多有一个匹配的行,通过索引一次就找到了;如果将主键放在WHERE 列表中,MySQL可以将该查询转为一个常量。 |
eq_ref | 使用唯一性索引,每一个索引值,表中只有一条数据与之匹配。 |
ref | 相比eq_ref 不使用唯一索引,而是使用普通索引或唯一性索引的部分前缀,索引要和某个值相比较,可能找到多个符合条件的行。 |
range | 一般出现在范围性查询,比如大于小于等操作中。 |
index | 表示全索引扫描。 |
ALL | 表示全表扫描,性能最差。 |
key_len
列表示索引的长度。
计算规则如下:
类型 | 长度 |
---|---|
char(n) | n字节长度 |
varchar(n) | 如果是utf-8 ,则长度3n+2 字节,两个字节存储字符串长度 |
tinyint | 1字节 |
smallint | 2字节 |
int | 4字节 |
bigint | 8字节 |
date | 3字节 |
timestamp | 4字节 |
datetime | 8字节 |
另外:如果字段允许NULL,需要增加1字节记录是否为NULL。
ref
列表示查询条件是什么类型,比如查询条件为常量时就是const
filtered
列表示过滤比例,经过索引过滤后剩下多少满足;最大值为100,这意味着未对行进行筛选,将进行全表扫描;
Extra
列这列展示额外信息。
类型 | 说明 |
---|---|
Using index | 使用覆盖索引,表示使用索引树就可以查询到所有的结果,不需要回表查询。 |
Using where | 使用where语句处理结果,并且查询的列未被索引覆盖。 |
Using index condition | 查询的列不被索引覆盖,where条件中是一个前导列的范围。 |
Using temporay | 表示使用了临时表。 |
Select tables optimized away | 使用了聚合函数,比如max、min来访问存在索引的字段。 |
① 如果在查询结果集中既有唯一索引,也有二级索引,这时会使用二级索引;辅助索引占用磁盘链比较少。
② 如果SQL中使用了不等于的时候,大多数情况下无法使用索引,会进行全表扫描。
③ SQL中使用了IS NULL
、IS NOT NULL
大多数情况无法使用索引,会进行全表扫描。
④ SQL中使用LIKE
模糊查询时,写法如%abc...
无法使用索引,会进行全表扫描;百分号在后时会使用索引,如abc%
;可以尝试使用覆盖索引,使被查询的列被索引覆盖。
⑤ 减少使用OR
或IN
使用频率,多数情况下无法使用索引。
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 6:55:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |