1、id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
2、select_type: SELECT 查询的类型.
- SIMPLE(简单SELECT,不使用UNION或子查询等)
- PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
- UNION(UNION中的第二个或后面的SELECT语句)
- DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
- UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
- SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
- DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
- DERIVED(派生表的SELECT, FROM子句的子查询)
- UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
3、table: 查询的是哪个表
4、partitions: 匹配的分区
5、type:
结果值从好到坏依次是:
system > const > eq_ref > ref > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。
- All :最坏的情况,全表扫描
- index:和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
- range:范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
- ref:一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同的是,它用在关联操作只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的带索引的列。
- eq_ref:最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效)
- const:当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)
- system:这是const连接类型的一种特例,表仅有一行满足条件。
6、possible_keys: 此次查询中可能选用的索引
7、key: 此次查询中确切使用到的索引.
8、ref: 哪个字段或常数与 key 一起被使用
9、rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
10、filtered: 表示此查询条件所过滤的数据的百分比
11、extra: 额外的信息
- Using where:SQL使用了where条件过滤数据
- Using filesort:得到所需结果集,需要对所有记录进行文件排序;例:在一个没有建立索引的列上进行了order by
- Using temporary:需要建立临时表(temporary table)来暂存中间结果
- Using join buffer:需要进行嵌套循环计算;例:两个关联表join,关联字段均未建立索引
好文推荐:
58沈剑:如何利用工具,迅猛定位低效SQL