字段 | 属性 | 解释 |
id 执行顺序id | 数字 | sql语句执行顺序,sql需要被分步执行时,数据库执行的顺序 id越大越先被解析执行,id相同时,从上往下解析执行 |
select_type 查询类型 | SIMPLE 简单查询 | 简单的select查询,查询中不包含子查询或者union |
PRIMARY 主查询 | 查询中包含任何复杂的子部分,最外层查询则被标记为primary |
SUBQUERY 子查询 | 在select 或 where列表中包含了子查询 |
DERIVED 派生查询 | 在from列表中包含的子查询被标记为derived(衍生),外层查询会从这个派生查询的结果集(临时表)中查询数据 |
UNION 联合查询 | 若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived |
UNION RESULT 联合结果集查询 | 从union表获取结果的查询 |
table | 表名 | 被查询的表 |
partitions | 分区 | 操作的分区 mysql的表当数据量很大时可以分区存储。 分区的类型又分 1. Range partition(范围分区) 2. List partition(列表分区) 3. Hash partition(哈希分区) 4. Key partition(键值分区) 分区表相关博客 MySQL分区表详解_V1ncent Chen的博客-CSDN博客_mysql分区表 |
type | system | 表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,可以忽略不计 | 查找性能从上到下越来越差 我认为它于select_type的区别是,select_type代表我查了哪里,type表示我怎么查了它,前者为where后者为how。 性能从上到下越来越差 |
const | 表示通过索引一次就找到了,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。 |
eq_ref | 唯一性索引扫描,一条索引匹配一条记录 |
ref | 非唯一性索引扫描,一条索引匹配多条记录 |
range | 对索引进行了范围扫描 |
index | 对所有索引进行查找 |
all | 对所有数据进行查找,常说的全表查询 |
possible_keys | 可能用到的索引 | 查询具体字段时,此字段上设置的索引,但并不一定使用,或者无法使用。 |
key | 实际上用到的索引 | 查询时,用到的索引 |
key_len | 索引所占字节数 | 索引中使用的字节数,可通过该列计算查询中使用的索引的长度,索引所占的字节数越少越好 |
ref | 引用列名 引用字段 | 表a和表b联合查询时,如果a表中的索引列被用于b表的查询的条件, 那么a表的索引列名会被显示到ref中(自己的理解) |
row | 查询行数 | 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数 |
filtered | 过滤百分比 | 比如通过某种type方式查询出100条数据,实际需要的数据只有70条,那么百分比为70%。因此一般情况这个值越大越好。但不是sql优化的唯一参考。 |
Extra | Using filesort | 对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序” | 十分重要的额外信息 |
Using temporary | 使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by |
Using index | 表明相应操作使用了“覆盖索引”,所需查找的数据就在索引的叶子节点上。不需要访问表的数据行。因此在select查询字段时,如果查询的字段里有个别字段没有被索引覆盖,数据库就不会使用Using index,则需要读取整个行 |
Using where | 使用了where过滤 |
Using join buffer | 代表多表join时,生成了join缓冲区。 |
impossible where | 代表不可能的条件查询。比如where a=1 and a=2 |
select tables optimized away | 代表在没有GROUPBY子句的情况下,基于索引优化了MIN/MAX操作,或者对于MyISAM存储引擎优化了COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。 |
distinct | 优化了distinct操作,在找到第一匹配的元组后即停止找同样值的动作 |