EXPLAIN关键字可以模拟优化器执行SQL查询语句,分析查询语句或者是表结构的性能瓶颈。
相关字段含义如下:
字段 | 含义 |
---|---|
id | 表示执行的优先级,值越大优先级越高(多见于子查询);id值一样的情况下,从上往下顺序执行。 |
select_type | 表示select的类型,常见取值有simple(简单表,即不使用表连接或者子查询),primary(主查询,即外层的查询),subquery(子查询),union(union关键字后面的select),derived(衍生,from子句的子查询) |
table | 查询的表 |
type | 查询使用了何种类型,最好到最差的连接类型:system>const>eq_ref>ref>range>index>all, (一般来说,SQL语句得保证查询达到range级别,最好达到ref) |
possible_keys | 可能使用的索引 |
key | 实际使用的索引 |
key_len | 索引的最大可能长度,在不损失精确性的情况下,长度越短越好。 |
ref | 显示了哪些列或常量被用于查找索引列上的值。常见的值有:const,func,null,字段名。 |
rows | 扫描行的数量 |
filtered | 指返回结果的行占需要读到的行(rows列的值)的百分比,一般来说越大越好。 |
extra | 执行情况的额外信息描述 |
type字段说明:
- system:表中只有一条数据,等于系统表(引擎只能使MYISAM和MEMORY)
- const:使用主键或者唯一索引,可以将查询的变量转成常量。(例如:… where id=3 或者where name=‘name1’
- eq_ref:类似ref,区别在于使用唯一索引,返回匹配的唯一一条数据(通常在连接时出现,例如:explain select t1.name from t1, t2 where t1.name= t2.name)。
- ref: 非唯一性索引,可以返回多行匹配的数据。
- range: 范围查询,使用索引返回一个范围中的行(例如:… where id >3)
- index: 以索引顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描。
- all: 全表扫描,应尽量避免。
extra字段说明:
- using index: 使用了覆盖索引,覆盖索引的好处是一条SQL通过索引就可以返回我们需要的数据, 不需要通过索引回表。
- using index condition: 在5.6版本后加入的新特性:索引下推(Index Condition Pushdown),索引下推是在非主键索引上的优化,可以有效减少回表的次数,大大提升了查询的效率。。查询的列不完全被索引覆盖,where条件中是一个前导列的范围。会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行; using index condition = using index + 回表 + where 过滤。
- using where: 查询时没使用到索引,然后通过where条件过滤获取到所需的数据。
- using temporary: 表示查询时,mysql使用临时表保存结果。效率较低,应当尽量避免。
- using filesort: 当SQL中包含 ORDER BY 操作,而且无法利用索引完成排序操作的时候,MySQL不得不选择相应的排序算法来实现,这时就会出现Using filesort,效率较低,应该尽量避免。
mysql慢查询参考:https://blog.csdn.net/qq_40884473/article/details/89455740
索引优化规约参考:https://www.cnblogs.com/riches/p/14755799.html
索引优化参考: https://www.cnblogs.com/riches/p/14805926.htm