MySQL explain

这篇具有很好参考价值的文章主要介绍了MySQL explain。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

mysql explain(或desc)用于分析SQL语句的执行计划,多用于测试查询性能。语法:explain sql...

注意

  1. explain执行DML语句,数据不发生变化。
  2. explain执行的结果可以有多条数据,一条数据对应一个表,如果涉及union,MySQL内部会产生一个临时表,就会导致结果多一行数据。
  3. union all不会创建临时表,所以就不会有多一行的数据。

id

这是select编号,不是返回结果的自增id。
值越大优先级越高。
如果涉及多表join,id就会重复,因为就一个select。
涉及子查询,MySQL Server 优化器 可能会把子查询转化为join,所以联调select id可能都是1
涉及union,临时表的那一列,id值为null。

select_type

操作类型,包括简单表查询、联合查询、子查询等。

  • SIMPLE: 简单表查询,不包含union或者子查询。
  • PRIMARY: 主查询,复杂查询中的最外层查询,或者union中左边的表。
  • SUBQUERY: 不相关子查询
  • DEPENDENT SUBQUERY: 依赖外部查询的子查询,或者称之为相关子查询。
  • DERIVED: 派生表,从查询结果派生的临时表,from后面的子查询。
  • UNION: UNION 查询中各个子查询的操作类型。
  • UNION RESULT: UNION 查询的结果集。
  • DEPENDENT UNION: 依赖外部查询的 UNION 查询,也就是子查询中有union
  • UNCACHEABLE SUBQUERY: 无法被缓存的子查询。
  • UNCACHEABLE UNION: 无法被缓存的 UNION 查询。

table

被操作的表,用于显示被操作的对象。
实际表名:表示查询语句中直接引用的表名。

  • <derivedN>:表示派生表,它是从查询结果中派生出来的临时表,派生表的编号可能是 1、2、3 等。
  • <unionM-N>:表示 UNION 查询中的结果集,其中 M 表示结果集的编号,N 表示 UNION 查询中的子查询编号。
  • <temporary>:表示临时表,这是在查询过程中创建的临时存储表。
  • <subqueryN>:表示子查询结果,其中 N 是子查询的编号。

partitions

分析 MySQL 查询语句如何利用分区表的工具,可以查看 MySQL 执行查询时会涉及到哪些分区,以及查询优化器如何选择分区来执行查询。

type

返回在执行查询时使用的访问方法,和索引相关, 已做排序。

  • system,当使用MyiSAM或Memory引擎的表只有一条记录的时候是system,不要奢望。
  • const:使用主键索引,或唯一索引等值匹配。
  • eq_ref:使用join时,被驱动表通过主键或者唯一索引列进行等值关联的方式,例如select * from a left join b on a.id = b.id;,b是eq_ref,a是all。
  • ref: 使用非唯一索引等值匹配。
  • range:对添加过任意索引的列,进行范围匹配,<、<=、>、>=、in、between。
  • index:MySQL 使用索引来扫描整个索引树,不需要回表,通常会发生在覆盖索引的情况。
  • ALL:全表扫描。

不常见类型:

  • fulltext:全文索引。
  • ref_or_null:对二级索引进行等值匹配,并添加or = null的条件。
  • index_merge:使用了多个单列索引来执行查询。当在查询条件中存在多个列,且每个列都有单独的索引时。
  • unique_subquery:不容易遇见,in 后面跟子查询,查询优化器将in转换为exists子查询,且这些自查徐你可以使用到主键进行等值匹配才可以。如explain select * from table1
    where field in (select id from table2 where talbe1.fieldn = 'string') or field2 = 'string'
  • index_subquery:使用子查询的结果作为索引来访问另一个表。

possible_keys

根据where/group by修饰的字段,可能使用的索引,并不保证实际执行时一定会使用这些索引,可以有多个。

key

表示实际选择的索引。

keylen

索引字段的最大长度,单位字节,值越大越好,主要对于联合索引有参考意义。
注意这里的越大越好,是跟当前字段的情况比较,如int类型占4个字节,显示4或者5(包含null)就很好。如果是varchar(100),则显示400,或403(utf8mb4+null+记录长度的字节 ==> 100 * 4 + 1 + 2,如果字段不为null,则省掉一个字节),比显示260更好。

ref

索引列做等值查询时,与索引列进行等值匹配的对象信息,对性能优化参考意义不大。
例如等值匹配到了,返回const。

rows

预估本次查询要扫描的行数,值越小越好,小了代表范围精准,进而实现快速查找。

filtered

该filtered列指示按表条件过滤的表行的估计百分比。越大越好。最大值为 100,这意味着没有发生行过滤。
从 100 开始递减的值表示过滤量的增加。。例如如果 rows为 1000, filtered为 50.00 (50%),则与下表连接的行数为 1000 × 50% = 500。

Extra

用于备注补充。

  • Using temporary:表示SQL使用union创建的临时表所在行。
  • Using index 表示查询使用了覆盖索引,即只使用了索引而没有访问实际的数据行,这通常发生在查询条件中包含了索引覆盖的所有列。
  • Using where 表示查询使用了 WHERE 子句过滤数据。
  • Using temporary 表示查询需要创建临时表来处理结果集,这可能发生在使用了临时表进行排序操作或者连接操作时。
  • Using filesort 表示查询需要对结果集进行文件排序操作,这通常发生在无法使用索引完成排序时。
  • Using join buffer 表示查询使用了连接缓冲区来处理连接操作。
  • Impossible WHERE 表示 WHERE 子句的条件总是为 false,因此查询将返回空结果集。
  • Select tables optimized away表示由于某些优化,查询将跳过不必要的表访问。
  • Full table scan 表示查询将对整个表进行全表扫描,没有使用任何索引。
  • Using index condition:表示使用了索引下推。
  • Using index for group-by:表示查询使用了索引进行分组操作。
  • Using index for order by:表示查询使用了索引进行排序操作。
  • Using index for distinct 表示查询使用了索引进行去重操作。
  • Using index for limit:表示查询使用了索引来执行 LIMIT 操作。
  • Using index for merge:表示查询使用了索引合并进行连接操作。
  • Using where with pushed condition:表示查询的 WHERE 条件中的部分条件被推迟执行。
  • Loose index scan: 表示在一些情况下,MySQL 可能对索引的列进行宽松扫描,而不是精确匹配。
  • Range checked for each record: 表示对于每个匹配的记录,都需要进一步检查范围条件。
  • Using index for LIKE: 表示使用索引执行了 LIKE 查询。
  • Distinct: 表示在处理查询数据时会进行去重操作。
  • Order by: 表示查询需要进行排序操作。
  • Table is marked as crashed and should be repaired: 表示表已标记为损坏,需要修复。
  • No tables used: 表示查询使用了某种优化方式,无需访问任何表。
  • Range checked for each record (index map: N): 和 Range checked for each record 类似,但额外说明了哪个表进行了进一步的范围检查。

扩展

explain 支持使用原生SQL进行json格式输出,用法explain format=json sql...。文章来源地址https://www.toymoban.com/news/detail-837791.html

到了这里,关于MySQL explain的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用 Explain 分析 SQL 语句?

    MySQL中 EXPLAIN 命令是我们分析和优化SQL语句的利器。 如何使用 EXPLAIN 来分析SQL语句,接下来有15个例子,一起学习呗 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 EXPLAIN 可以用于分析MySQL如何执行一个SQL查询,包括如何选择

    2024年01月16日
    浏览(42)
  • MySQL explain

    mysql explain(或desc)用于分析SQL语句的执行计划,多用于测试查询性能。语法:explain sql... explain执行DML语句,数据不发生变化。 explain执行的结果可以有多条数据,一条数据对应一个表,如果涉及union,MySQL内部会产生一个临时表,就会导致结果多一行数据。 union all不会创建临

    2024年03月09日
    浏览(51)
  • mysql explain 字段

    EXPLAIN SELECT *  FROM t_user2; EXPLAIN SELECT * FROM t_user2 WHERE user_name = \\\'r1\\\' CREATE INDEX index_username ON t_user2(user_name); EXPLAIN SELECT * FROM t_user2 WHERE user_name = \\\'test\\\'; EXPLAIN SELECT * FROM t_user2 WHERE user_name = CONCAT(user_name,\\\'01\\\'); 索引失效 EXPLAIN SELECT * FROM t_user2 WHERE user_name LIKE \\\'test\\\'; EXPLAIN SELECT * FROM t

    2024年03月26日
    浏览(51)
  • Mysql---explain详解

    explain命令是用来分析查询语句的执行计划的工具。它可以显示查询语句的执行计划,包括查询的顺序、使用的索引、扫描的行数等信息,帮助开发人员优化查询语句的性能。通过分析执行计划,可以找到查询语句的瓶颈,进而优化查询语句的性能,提高数据库的响应速度 *

    2024年02月13日
    浏览(33)
  • MySQL explain详解

    MySQL 的 EXPLAIN 是一个用于查询优化的。它用于分析和评估查询语句的执行计划,帮助开发者理解查询语句的性能问题以及优化查询的方式。 使用 EXPLAIN ,可以获取关于查询执行计划的详细信息,包括表的访问顺序、连接方式、索引使用情况等,这些信息能够帮助

    2024年02月15日
    浏览(33)
  • MYSQL EXPLAIN 执行计划

    有了慢查询语句后,就要对语句进行分析。一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。

    2024年02月05日
    浏览(45)
  • 【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

    目录 ID select_type 查询类型 table 表名 type 关联类型/访问类型 possible_keys MySQL觉得可能要用到的索引 key 实际用到的索引 key_len 用到的索引的长度(比如可用于判断使用了联合索引中的哪几个) ref 表查找值所用的列(表名.字段)或常量(const) row 预估要读取并检测的行数 Ext

    2023年04月09日
    浏览(37)
  • Mysql Explain各字段说明

    id :同一个select,id都是1;不同的select,id才不同。 select_type: 查询类型 SIMPLE:普通查询 PRIMARY:主查询 SUBQUERY:子查询 DEPENDENT SUBQUERY:子查询,不能被优化为连接查询 UNION:联合查询 UNION:联合查询后,去除重复的数据 UNION ALL: 不去除重复的数据 table:表 partitions: type:索引

    2024年01月19日
    浏览(49)
  • MySQL的执行计划详解(Explain)

    在 MySQL 中可以通过 explain 模拟优化器执行 SQL语句,从而知道 MySQL 是如何处理 SQL 语句的。 • 客户端向 MySQL 服务器发送一条查询请求 • 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段 • 服务器进行 SQL 解析、预处理、

    2023年04月26日
    浏览(52)
  • 超级详解MySQL执行计划explain

            要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。          MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的。 应用层,主要负责与客

    2023年04月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包