mysql之explain

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

type列

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

index性能为什么比较靠后

是指用到了索引,是index类型的方式:这种类型表示是mysql会对整个该索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个复合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引。https://www.zhihu.com/question/36996520/answer/93256153

正常利用到索引的类型

ref:这种类型表示mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每一个数据都进行一 一的扫描判断,也就是所谓你平常理解的使用索引查询会更快的取出数据。

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需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

posted @ 2019-12-05 14:41  cashew  阅读(311)  评论(0编辑  收藏  举报