Explain关键字是Mysql中sql优化的常用「关键字」,通常都会使用Explain来「查看sql的执行计划,而不用执行sql」,从而快速的找出sql的问题所在。
EXPLAIN SELECT * FROM user;
总计有十二个字段:
id字段:id表示执行select查询语句的序号,一般出现在多重嵌套的查询中,它是sql执行的顺序的标识,sql按照id从大到小执行,id相同的为一组,从上到下执行。
比如explain ( select * from user where id in (select user_id from role))
两者的id都相同,便表示sql的执行从上往下执行。
若两者的id不相同,id越大的就越先执行(一般是子查询)
select_type字段: 表示该语句是简单查询、简单的子查询、from子句的子查询还是union查询
table字段: table字段表示的是查询的是哪个表
type字段: type字段表示的sql关联的类型或者说是访问的类型,从这个字段中我们可以确定这条sql查找数据库表的时候,查找记录的大概范围是怎么样的,直接就能体现sql的效率问题。
比如:
system:表示表中只有一行记录
const:唯一索引或者主键索引中使用等值查询,一次索引找到记录。
eq_ref:表示使用唯一索引或者主键索引扫描作为表链接匹配条件,对于每一个索引键,表中只有一条记录与之匹配。
ref:ref与eq_ref的区别就是eq_ref使用的是唯一索引或者主键索引。
range:range使用索引来检索给定范围的行数据,一般是在where后面使用between、大于小于号等
index:表示会遍历索引树,但是出现index说明需要检查自己的索引是否使用正确。
ALL:全表查询。
possible_keys: 表示这一列查询语句可能使用到的索引
key字段: 表示的真正使用到的索引
key_len字段: 表示sql查询语句中索引使用到的字节数,这个字节数并不是实际的长度,而是通过计算查询中使用到的索引中的长度得出来的,显示的是索引字段最大的可能长度。
ref字段:
rows字段: rows表示估算的要扫描的行数。
Extra字段:
Using index: 表示查询的列被索引覆盖,这个是查询性能比较高的体现,即所要查询的信息搜在索引里面可以得到,不用回表。
Using where:该属性与Using index相反,查询的列并没有被索引覆盖,where条件后面使用的是非索引的前导列。
partitions、filtered字段: partitions表示所匹配的分区;filtered表示的是查询表行所占表的百分比。