MySQL:MySQL的EXPLAIN各字段含义详解

  在MySQL中,EXPLAIN是一个强大的工具,用于获取关于SELECT语句执行计划的信息。当你对查询性能有疑问时,使用EXPLAIN可以帮助你理解MySQL如何执行你的查询,并可能揭示性能瓶颈。

以下是EXPLAIN输出中各个列的详细解释:

一、 id

  1.查询的标识符。每个SELECT都有一个唯一的标识符。

  2.如果查询中有子查询,那么这个ID可以显示子查询的顺序。

二、select_type

查询的类型

常见的值有:

  1.SIMPLE:简单的SELECT,不包含子查询或UNION

  2.PRIMARY:查询中最外层的SELECT

  3.UNION、DEPENDENT UNION:内层查询依赖于外层查询的结果集

  4.UNION RESULT:UNION的结果集

  5.SUBQUERY:子查询中的第一个SELECT

三、table

  1.输出结果集的表。

  2.如果查询涉及多个表,则此列表示MySQL决定按哪个表的顺序来连接它们。

四、type

连接类型

这是非常重要的列,因为它显示了MySQL决定如何连接表

常见的值有:

  1.system:表只有一行,等于const

  2.const:表最多有一个匹配行

  3.eq_ref:所有部分都使用了唯一索引或主键

  4.ref:非唯一索引或唯一索引的非唯一前缀

  5.fulltext:使用全文索引

  6.ref_or_null:与ref类似,但增加了对NULL值的搜索

  7.index_merge:表示使用了索引合并优化方法

  8.unique_subquery:用于IN子查询,以确保子查询返回唯一值

  9.index_subquery:与unique_subquery类似,但可能返回非唯一值

  10.range:对索引进行范围查找

  11.index:全索引扫描,比全表扫描稍快

  12.ALL:全表扫描

五、possible_keys

显示可能应用在这张表中的索引。注意是可能,但不一定真的会用到。

  1.key:实际使用的索引。如果为NULL,则没有使用索引。

  2.key_len:使用的索引的长度。在不使用全部索引列的情况下,可以为你提供实际使用的索引部分的信息。

  3.ref:显示哪些列或常量被用作索引查找上的参考点。

  4.rows:MySQL估计必须检查的行数来找到相关的行。注意这是一个估计值。

  5.filtered:表示返回结果的行数占需要检查的行数的百分比。

六. Extra

包含不适合在其他列中显示的额外信息。

  1.Using filesort:MySQL需要对结果进行排序,这通常意味着没有可用的索引来完成排序操作,因此可能导致性能下降。

  2.Using temporary:表示MySQL需要使用临时表来保存查询结果,这可能会增加I/O操作并降低性能。

  3.Using index:表示查询只需要访问索引,而无需访问数据行。这通常意味着查询会更快。

  4.Using where:表示使用了WHERE子句来过滤结果。

  5.Using join buffer:表示使用了连接缓冲区来辅助连接操作。

代码示例

EXPLAIN SELECT *  from users
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |  
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  
|  1 | SIMPLE      | users | NULL       | ref  | idx_name      | idx_name | 767    | const|    1 |   100.00 | Using where |  
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

  在这个示例中,type 是 ref,表示 MySQL 使用了非唯一索引或唯一索引的非唯一前缀来连接表。possible_keys 和 key 列都显示了 idx_name 索引被使用。rows 列为 1,表示 MySQL 估计只需检查 1 行就能找到匹配的行。Extra 列中的 Using where 表示 MySQL 使用了 WHERE 子句来过滤结果。

七、优化建议

1.type = ALL (全表扫描)
  建议:添加适当的索引,尤其是WHERE子句、JOIN条件和ORDER BY子句中涉及的列。

2.type = index (全索引扫描)
  建议:如果查询只需要索引中的部分信息而不是整行数据,考虑使用COVERING INDEX(覆盖索引),即索引包含了查询所需的所有数据。

3.rows列的值非常大
建议:检查WHERE子句是否足够严格以限制返回的行数。考虑添加或修改索引以减少需要检查的行数。

4.key_len列的值非常大
  建议:如果key_len的值很大,可能是因为索引包含了较大的列(如VARCHAR(255))或复合索引中有很多列。考虑使用更小的数据类型或更少的索引列。

5.possible_keys列有值但key列为NULL
  建议:即使MySQL识别到可能有用的索引,但由于某些原因(如索引不是最优选择、统计信息不准确等)它没有使用。考虑重新评估索引策略或更新统计信息。

6.Extra = Using filesort
  建议:如果排序是必需的,考虑添加复合索引,将ORDER BY子句中的列作为索引的一部分。如果可能,避免在查询中混合使用ASC和DESC排序。

7.Extra = Using temporary
  建议:对于涉及GROUP BY、DISTINCT或UNION等操作的查询,确保使用了合适的索引。考虑重写查询以减少临时表的使用

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值