首页
学习
活动
专区
圈层
工具
发布

mysql 使用explain

基础概念

EXPLAIN 是 MySQL 中的一个命令,用于分析 SQL 查询的执行计划。通过 EXPLAIN,你可以查看 MySQL 如何执行你的查询,包括它将访问哪些表、使用哪些索引、数据表的连接顺序等。这对于优化查询性能非常有帮助。

相关优势

  1. 性能调优:通过分析查询计划,可以找出慢查询的原因,从而进行针对性的优化。
  2. 理解查询执行过程:了解 MySQL 如何处理查询,有助于更好地设计数据库结构和编写高效的 SQL 语句。
  3. 索引优化:通过查看查询计划,可以确定是否需要添加或修改索引以提高查询效率。

类型

EXPLAIN 输出的结果包含多个字段,主要包括以下几类:

  • id:查询的标识符,表示查询中子查询或表的执行顺序。
  • select_type:查询的类型,如 SIMPLEPRIMARYSUBQUERY 等。
  • table:当前操作的表。
  • type:连接类型,如 ALLindexrangerefeq_refconst 等,表示 MySQL 如何获取行数据。
  • possible_keys:可能使用的索引。
  • key:实际使用的索引。
  • key_len:使用的索引长度。
  • ref:显示了哪些列或常量被用作索引查找的条件。
  • rows:MySQL 预计需要检查的行数。
  • Extra:包含不适合在其他列中显示的额外信息,如 Using whereUsing indexUsing temporary 等。

应用场景

  1. 慢查询优化:当某个查询执行时间过长时,可以使用 EXPLAIN 分析其执行计划,找出性能瓶颈。
  2. 索引优化:通过分析查询计划,确定是否需要添加或修改索引以提高查询效率。
  3. 查询重构:有时通过 EXPLAIN 可以发现查询的编写方式不够高效,需要进行重构。

示例

假设有一个简单的查询:

代码语言:txt
复制
EXPLAIN SELECT * FROM users WHERE age > 30;

假设 users 表有一个索引在 age 列上,EXPLAIN 的输出可能如下:

代码语言:txt
复制
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | users | range | age           | age  | 4       | NULL |   10 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

在这个例子中:

  • typerange,表示 MySQL 使用索引范围扫描。
  • keyage,表示实际使用了 age 索引。
  • rows 为 10,表示 MySQL 预计需要检查 10 行数据。
  • Extra 中的 Using where 表示查询条件被用于过滤行。

常见问题及解决方法

  1. 全表扫描(type = ALL)
    • 原因:没有合适的索引,或者查询条件无法利用索引。
    • 解决方法:添加合适的索引,或者优化查询条件。
  • 使用临时表(Extra = Using temporary)
    • 原因:查询涉及复杂的连接或排序操作,MySQL 需要创建临时表来存储中间结果。
    • 解决方法:优化查询语句,减少不必要的连接和排序操作。
  • 索引未被使用(key = NULL)
    • 原因:查询条件无法利用索引,或者 MySQL 认为全表扫描更高效。
    • 解决方法:检查查询条件是否正确,或者添加更合适的索引。

参考链接

通过 EXPLAIN 命令,你可以更好地理解和分析 SQL 查询的执行过程,从而进行针对性的优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL EXPLAIN 的使用

EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。...可以为相关的域从WHERE语句中选择一个合适的语句 key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。...这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引 key_len:使用的索引的长度...在不损失精确性的情况下,长度越短越好 ref:显示索引的哪一列被使用了,如果可能的话,是一个常数 rows:MYSQL认为必须检查的用来返回请求数据的行数 Extra:关于MYSQL如何解析查询的额外信息...因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待 eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

80510
  • MySQL EXPLAIN ANALYZE

    Ryeng 译:徐轶韬 MySQL8.0.18刚刚发布,它包含一个全新的功能EXPLAIN ANALYZE,用来分析和理解查询如何执行。 EXPLAIN ANALYZE是什么?...EXPLAIN ANALYZE是一个用于查询的分析工具,它向用户显示MySQL在查询上花费的时间以及原因。它将产生查询计划,并对其进行检测和执行,同时计算行数并度量执行计划中不同点上花费的时间。...这项新功能建立在常规的EXPLAIN基础之上,可以看作是MySQL 8.0之前添加的EXPLAIN FORMAT = TREE的扩展。...EXPLAIN除了输出查询计划和估计成本之外,EXPLAIN ANALYZE还会输出执行计划中各个迭代器的实际成本。 如何使用?...EXPLAIN ANALYZE是MySQL查询分析工具里面的一个新工具: 检查查询计划:EXPLAIN FORMAT = TREE 分析查询执行:EXPLAIN ANALYZE 了解计划选择:Optimizer

    1.9K20

    mysql explain详解

    Explain简介 本文主要讲述如何通过 explain 命令获取 select 语句的执行计划,通过 explain 我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了...下面是使用 explain 的例子: 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from...or 的时候没有用 primary key,而是使用了 primary key(id) 和 tenant_id 索引 mysql> explain select * from role where id...如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。...7. key_len列 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。

    42.1K2322

    MySQL explain extra

    MySQL执行计划中,extra可以展示执行的一些细节,比如索引下推,覆盖索引,排序等信息,为索引优化提供了更完整的信息 常见的extra extra有很多,这里只列出了最常见的几种类型 Using...查询条件中 Using index condition: 索引下推(Index Condition Pushdown) Using filesort:Server层需要做额外的排序操作,需要优化,让排序使用到索引...因为接近的索引,可能在相同的页上 Using temporary:使用了临时表,需要优化 疑问 条件中只有一个条件,是索引的第一个字段,也可能Using index condition,这个就太不明白了...> explain select * from user where name like 'hello%'; +----+-------------+-------+------------+-----.../doc/refman/8.0/en/explain-output.html#explain-extra-information Mysql-explain之Using temporary和Using

    1.1K30

    mysql explain 详解

    表使用了分区,则会显示出具体需要查询的分区 type 访问类型 mysql在查询中找到数据的查询方式,从上往下,性能从最好到最差 system                该表只有一行数据(系统表),...能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null) key mysql决定使用的索引,一定会在possible_keys...表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数 当估算行数超出总数的30%(默认情况)时,mysql将拒绝使用索引,转为全表查询 (select * from table...matching min/max row                  当查询列表处有 MIN 或者 MAX 聚集函数,但是并没有符合 WHERE 子句中的搜索条件的记录时,将会提示该额外信息( EXPLAIN...如果 WHERE 子句中包含要求被驱动表的某个列等于 NULL 值的搜索条件,而且那个列又是不允许存储 NULL 值的,那么在该表的执行计划的 Extra 列就会提示 Not exists 额外信息( EXPLAIN

    1.4K20

    Mysql Explain 详解

    system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。...五、possible_keys 指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用 该列完全独立于EXPLAIN输出所示的表的次序。...如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 六、Key key列显示MySQL实际决定使用的键(索引) 如果没有选择索引,键是NULL。...要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。...• EXPLAIN不考虑各种Cache • EXPLAIN不能显示MySQL在执行查询时所作的优化工作 • 部分统计信息是估算的,并非精确值 • EXPALIN只能解释SELECT操作,其他操作要重写为

    1.5K20

    MySQL - EXPLAIN详解

    概述 EXPLAIN: 为 SELECT语句中使用到的每个表返回一条信息。它按照MySQL在处理语句时读取它们的顺序列出这些表。MySQL使用循环嵌套算法解析所有连接。...QEP: SQL语句的查询执行计划 注意: 在以前版本的MySQL中,使用 EXPLAIN PARTITIONS 与 EXPLAIN EXTENDED 来生成分区和扩展信息 。...目前为止这些语法仍然是向后兼容的,但未来 MySQL会将它们排除出 EXPLAIN语法,因为现在 EXPLAIN默认就会输出分区和扩展的相关信息。...所以 PARTITIONS 与 EXTENDED关键字是多余的,不推荐使用,且在使用时会提示警告。 EXPLAIN 输出 本部分着重描述 EXPLAIN生成的结果。...如果是这样,那么就需要创造一个适当的索引,并再次用 EXPLAIN检查 key(JSON名:key) 显示MySQL实际决定使用的键(索引),如果MySQL决定使用其中一个 possible_keys

    1.9K21

    mysql explain详解

    对于经常使用mysql的兄弟们,对explain一定不会陌生。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联合和以什么次序的信息。...官方的关于explain的文档在http://dev.mysql.com/doc/refman/5.1/en/using-explain.html(英文),本文可作为官方文献的不完整通俗读物。...使用的方法 EXPLAIN tbl_name 或: EXPLAIN [EXTENDED] SELECT select_options 前者可以得出一个表的字段结构等等,后者主要是给出相关的一些索引信息,...key 显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。 key_len 显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。...文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。 ref 显示哪个字段或常数与key一起被使用。

    1.1K100

    MySQL之Explain详解

    设计MySQL的大叔贴心的为我们提供了EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,本章的内容就是为了帮助大家看懂EXPLAIN语句的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能...如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个EXPLAIN,就像这样: mysql> EXPLAIN SELECT 1; +----+-------------+-------+...这个id值就是EXPLAIN语句的第一个列,比如下边这个查询中只有一个SELECT关键字,所以EXPLAIN的结果中也就只有一条id列为1的记录: mysql> EXPLAIN SELECT * FROM...MySQL使用的是内部的临时表。...跟UNION对比起来,UNION ALL就不需要为最终的结果集进行去重,它只是单纯的把多个查询的结果集中的记录合并成一个并返回给用户,所以也就不需要使用临时表。

    1.4K20

    MySQl索引(二)如何看懂explain工具信息,使用explain工具来分析索引

    EXPLAIN 工具能用于获取查询执行计划,即分析 MySQL 如何执行一个 SQL 语句。...我们可以根据EXPLAIN 输出的数据来分析如何优化查询语句,提升查询语句的性能瓶颈。 如何使用 EXPLAIN ?...在 select 语句之前增加 explain 关键字即可使用EXPLAIN 工具。MySQL 会在查询上设置一个标记,此时,执行查询不会返回查询结果,而是返回执行计划的相关信息。...在MySQL 5.7之前,可以通过 explain extended 显示filtered字段。 MySQL.5.7及更高版本,explain 默认展示 filtered 字段。...Datetime:8 字节 如果字段允许为 NULL,需要 1 字节记录是否为 NULL 覆盖索引定义:mysql 执行计划 explain 结果里的 key 有使用索引,如果 select 后面查询的字段都可以从这个索引的树中获取

    1.3K10

    mysql的explain详解

    我们在实际业务中经常会使用到explain,因为这里涉及到查询,下面我们来看一个例子,比如我们要查一本书的上一章或者下一章,我们的sql是这样: 查询5164这本书4054495这一章的上一章:下面的是...然后我改了一下sql,重新explain一下结果,如下: explain SELECT * FROM article force index(idx_1) WHERE (id mysql的查询,更多是注重扫描查询的行数,以及是否使用到索引,我常看的最重要的是扫描的rows字段,然后就key字段,看下extra的属性,这样就基本能解决问题了。...字段:key_len 解释:会用的索引的索引长度 字段:ref 解释:显示索引的哪一列被使用了,如果可能的话,是一个常数 字段:rows 解释:查询扫描的行数(这个是重点的) 常见值及其说明: 显示mysql...using temporary:mysql需要创建一张临时表来保存中间结果。也就是说,需要先把数据放到临时表中,然后从临时表中获取需要的数据。

    76330
    领券