点击上方“码农编程进阶笔记”,选择“置顶或者星标”
EXPLAIN SELECT * from user_info WHEREid = 1;
Explain查看查询计划主要包含如下信息列:查询id、查询类型、查询表、扫描访问类型、查询可能选用的索引、查询实际使用索引、mysql决定使用索引长度、ref 显示哪个字段或常数与key一起被使用、估算扫描行数、额外重要信息。--重点关注加粗部分。
主要通过以上指标评估查询好坏,从而做出相关调整优化,使SQL尽量最优。
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
ALL: 扫描全表
index: 只遍历索引树,直接从索引中就可以获取数据满足查询, 而不需要再去查询数据表中的数据. 这样的情况type 是index, 并且 Extra 的值是Using index.
range: 使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中.
ref:非唯一性索引(普通索引)扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的情况下, 使用system。
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。
注:key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
Using index:使用索引扫描。
using where:使用where限制,表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集。
Using filesort: MySQL中无法利用索引完成的排序操作称为“文件排序”。它跟文件没有任何关系,实际上是内部的一个快速排序。
Using temporary:MySQL需要使用临时表来存储结果集,常见于排序和分组查询。使用filesort和temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。
impossible where: 表示用不着where,一般就是没查出来啥。
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
求一键三连:点赞、转发、在看。