MySQL explan参数详细解读
2024-01-09 16:04:55
MySQL的EXPLAIN
语句用于分析SQL查询的执行计划,它返回的结果有助于理解MySQL如何处理和优化查询。以下是EXPLAIN
结果中各列参数的详细解读:
-
id:
- 标识SQL查询中的每个部分(例如子查询、联合查询等)的顺序。
- 值越大表示该部分在执行序列中的优先级越低(并不是绝对意义上的执行顺序)。
- 相同
id
值的部分属于同一个查询块,并按从上到下的顺序执行。 - 如果存在嵌套关系,MySQL会先执行
id
值较小的查询块。
-
select_type:
- 描述SELECT类型,可能的值包括:
- SIMPLE:简单SELECT,没有子查询或UNION。
- PRIMARY:外部查询(如果存在子查询,则外部的大查询为PRIMARY)。
- SUBQUERY:出现在FROM子句中的子查询。
- DERIVED:由FROM子句中的子查询派生出来的临时表(即“物化子查询”)。
- UNION / UNION RESULT:UNION操作符相关的查询或者结果集。
- 描述SELECT类型,可能的值包括:
-
table:
- 当前正在访问的表名,对于复杂的JOIN操作,会显示多个表格。
-
partitions(如果启用分区功能):
- 指定查询涉及到的分区信息。
-
type:
- 访问类型,指示MySQL是如何查找行的,性能好坏排序如下(最优至最差):
- system: 基于系统表,只有一行数据。
- const: 使用唯一索引,常量引用,通常对应一行记录。
- eq_ref: 对于每个来自于前面的表的行组合,从该表中读取一行,使用了索引,且索引的所有部分都被用作比较。
- ref: 使用非唯一索引或唯一索引的一部分进行查找,与某一个或几个列相比较。
- fulltext: 全文索引检索。
- ref_or_null: 类似ref,但还包括对NULL值的搜索。
- index_merge: 使用了两个以上索引合并查找。
- unique_subquery: 对于IN子查询,使用了唯一索引子查询。
- index_subquery: 对于IN子查询,使用了索引子查询。
- range: 索引范围扫描,使用索引来限制检索行的范围。
- index: 全索引扫描,覆盖索引访问而不需要回表。
- ALL: 全表扫描,不使用任何索引。
- 访问类型,指示MySQL是如何查找行的,性能好坏排序如下(最优至最差):
-
possible_keys:
- 查询时可能使用的索引列表。
-
key:
- 实际选择使用的索引,如果为NULL则表示没有使用索引。
-
key_len:
- 表示实际使用的索引长度,对于复合索引来说,这个值可以用来判断使用到了哪些列。
-
ref:
- 显示使用哪个字段或常量与key一起进行查找。
-
rows:
- MySQL根据统计信息估算出需要检查的行数,用于评估查询成本。
-
filtered:
- 结果集过滤后的预计百分比,表示存储引擎返回的数据中有多少比例符合WHERE条件。
-
Extra:
- 提供额外的信息,如:
- Using index:仅通过索引获取所需列,无需回表(覆盖索引)。
- Using where:WHERE子句用于筛选行。
- Using temporary:创建了临时表来处理查询。
- Using filesort:无法利用索引完成排序,因此进行了外部排序。
- Using join buffer (Block Nested Loop):使用连接缓存进行块嵌套循环连接操作。
- ...还有其他许多提示信息。
- 提供额外的信息,如:
通过对EXPLAIN
结果的深入解读,可以帮助我们发现查询的潜在性能瓶颈并采取相应措施进行优化,比如添加合适的索引、调整查询结构或者更新统计信息等。
文章来源:https://blog.csdn.net/SOFT2030/article/details/135480841
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!