mysql之explain

余生长醉 提交于 2019-12-06 14:19:19

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。
在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。
注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。

type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref

key列

这一列显示mysql实际采用哪个索引来优化对该表的访问。
如果没有使用索引,则该列是 NULL

key_len列

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了联合索引中的哪些
列。
key_len计算规则如下:
字符串
char(n):n字节长度
varchar(n):可变数据类型.最大n个字符。n字节长度,2字节存储字符串长度,如果是utf-8,则长度 3n
+ 2
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节 
时间类型
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半
部分的字符提取出来做索引。

ps:在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
https://blog.csdn.net/u010385646/article/details/50445291

Extra

https://blog.csdn.net/z69183787/article/details/53393153
https://www.cnblogs.com/wy123/p/7366486.html
Using index 查询的列被索引覆盖,并且where筛选条件是索引的是前导列(联合索引中的第一个字段),直接访问索引就足够获取到所需要的数据
Using index condition:用到了索引,但需要通过索引回表查询数据(用到索引的范围查询情况)。
Using where Using index:是一个非常模糊的东西,只是表示:无法“直接”通过索引直接查询到符合条件的数据。
Using where:没有用到了索引,使用 where 语句来处理结果,查询的列未被索引覆盖(type为ALL)
Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!