您的当前位置:首页>全部文章>文章详情

【MySql】mysql explain 查询详解

CrazyPanda发表于:2025-02-21 18:49:29浏览:78次TAG: #mysql

MySQL 的 EXPLAIN 语句是一个强大的工具,用于分析和优化查询的执行计划。它提供了关于 MySQL 如何执行查询的详细信息,包括表的访问顺序、访问方法、使用的索引、连接类型等。以下是 EXPLAIN 查询的详细解释:

使用方法

EXPLAIN SELECT ...;

或者更详细的格式:

EXPLAIN FORMAT=JSON SELECT ...;

输出列详解

  1. id

    • 数字标识符,表示查询中查询子句或表的顺序。较大的 id 通常表示更深层次的嵌套查询或子查询。
    • 如果 id 相同,则执行顺序由上至下;如果不同,id 越大优先级越高,通常表示被嵌套或子查询。
  2. select_type

    • 查询的类型,表明查询中每个 SELECT 子句的类型(或操作类型)。
    • 常见类型:
      • SIMPLE:简单的 SELECT 查询,查询中不包含子查询或 UNION。
      • PRIMARY:查询中最外层的 SELECT。
      • UNION:UNION 中的第二个或后续的 SELECT 语句。
      • DEPENDENT UNION:UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。
      • SUBQUERY:在 SELECT 或 WHERE 列表中包含了子查询。
      • DEPENDENT SUBQUERY:子查询,依赖于外部查询。
      • DERIVED:派生表的 SELECT 查询,即子查询在 FROM 子句中。
  3. table

    • 表名或别名,显示当前步骤所访问的表。
    • 有时显示为 derivedN(派生表)或临时表名。
  4. partitions

    • 匹配的分区信息(如果表有分区)。
  5. type

    • 连接类型或访问类型,表示 MySQL 在找到所需行时使用的访问方式。访问类型越高效,查询性能越好。
    • 常见类型:
      • system:表只有一行(特殊情况的 const)。
      • const:表最多有一个匹配行,用于主键或唯一索引比较。
      • eq_ref:对于每个从表行,从主表里读取一个行(最常见于主键或唯一索引)。
      • ref:非唯一索引扫描,返回所有匹配某个单值的行。
      • range:只检索给定范围的行,使用一个索引来选择行。
      • index:全表扫描,只是扫描索引树(比 ALL 快,因为通常索引比数据小)。
      • ALL:全表扫描,逐行操作,最慢的一种。
  6. possible_keys

    • 显示查询中能使用的索引。
  7. key

    • 实际使用的索引。如果为空,表示未使用索引。
  8. key_len

    • 使用的索引的长度(字节数)。长度越短,越高效。
  9. ref

    • 显示索引的哪一列或常量被用于查找值。
  10. rows

    • 估计为了找到所需的行而要读取的行数。这是一个估算值,并不总是准确。
  11. filtered

    • 显示估计的满足查询条件的行数百分比(针对存储引擎返回的行)。值越高,条件过滤效果越好。
  12. Extra

    • 包含不适合在其他列中显示但十分重要的额外信息。
    • 常见内容:
      • Using where:使用了 WHERE 条件来过滤行。
      • Using temporary:使用了临时表存储中间结果。
      • Using filesort:MySQL 需要额外的步骤来排序数据。
      • Using index:只通过索引树读取数据(索引覆盖),通常意味着高效查询。

使用 EXPLAIN 优化查询

通过分析 EXPLAIN 的输出,你可以识别查询中的潜在瓶颈,并采取相应的优化措施。例如:

  • 确保查询使用了索引,尤其是主键和唯一索引。
  • 避免全表扫描(ALL),尽量使用索引扫描(indexrangeref 等)。
  • 优化 WHERE 条件,减少扫描的行数。
  • 考虑重新设计表结构或索引,以提高查询效率。

示例

假设有一个简单的查询:

EXPLAIN SELECT * FROM employees WHERE department_id = 10;

EXPLAIN 输出可能如下:

+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table     | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | employees | ref   | dept_index    | dept_id | 4       | const |    1 | Using where |
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+

从这个输出中,你可以看到查询使用了 ref 访问类型,并且使用了 dept_id 索引,扫描的行数估计为 1 行。

通过 EXPLAIN,你可以深入了解查询的执行细节,从而进行有效的优化。

猜你喜欢

【MySQL】用时间戳按时间(年月日)分组统计
时间戳格式与时间格式的转化 (转为时间戳格式时,单位默认为秒,若需转为以毫秒单位,则结果*1000)SELECT UNIX_TIMESTAMP('2022-09-01 00:00:00'); SELECT FROM_UNIXTIME('1661961600','%Y-%m-%d %H:%i:%s');12精确时间范围的搜索SELECT * FROM table_name
发表于:2024-03-18 浏览:305 TAG:
【MySQL】mysql面试题
1. 什么是数据库事务?数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这意味着事务内的操作要么全部成功,要么全部失败,保持数据完整性,并且独立于其他事务运行。2. MySQL中InnoDB与MyISAM的区别是什么?InnoDB支持事务处理,行级锁定和外键,适用于需要高并发和事务处理的场景。MyISAM不支持事务和行级锁定,但读取速度快,适
发表于:2024-06-17 浏览:254 TAG:
【MySql】SELECT* 会导致查询效率低的原因
前言一、适合SELECT*的使用场景二、SELECT*会导致查询效率低的原因2.1、数据库引擎的查询流程2.2、SELECT*的实际执行过程2.3、使用SELECT*查询语句带来的不良影响三、优化查询...
发表于:2024-10-21 浏览:304 TAG: #mysql
【MySql】Centos7 安装 MySQL5.7 步骤
Centos7 安装 MySQL5.7 步骤(一)、使用yum源方式安装4.1 开启mysql的远程访问权限4.2 为firewalld添加开放端口33064.3 远程连接测试3.1 启动mysql并查看状态3.2 获取临时密码3.3 登录mysql3.4 修改登录密码2.1 下载mysql的yum源配置2.2 安装mysql的yum源2.3 使用yum方式安装mysql2.3.1 安装过程中报错解决1、卸载系统自带 mariadb2、下载并安装MySQL官方的 Yum3、使用并设置mysql4
发表于:2023-11-30 浏览:2115 TAG: #mysql #centos
【MySql】SQL boy的CRUD操作
文章目录增删查改:如何操作表中的数据?select|where|group by|havingfromorder bylimit插入数据记录插入查询结果添加数据删除数据修改数据查询数据增删查改:如何操作表中的数据?关于SQL的CRUD操作是很重要的,有些公司面试的时候会要求我们写一些SQL,我上次面试字节的时候就遇到了(手动狗头)。在我们的超市项目中,我们给用户设计好了一个数据库demo.goodsmaster,定义好了里面的字段以及各种约束,如下:mysql> desc&nbs
发表于:2023-12-08 浏览:410 TAG:
【MySql】关于外键和连接, 如何做到关联查询?
文章目录外键和连接:如何做关联查询?如何创建外键?连接关联查询中的误区外键和连接:如何做关联查询?在实际的数据库应用开发过程中,我们经常需要把2个或2个以上的表进行关联,以获取需要的数据。这是因为,为了提高存取效率,我们会把不同业务模块的信息分别存放在不同的表里面。但是,从业务层面上看,我们需要完整全面的信息为经营决策提供数据支撑。还是以超市项目为例,数据库里面的销售流水表一般只保存销售必需的信息,比如商品编号,数量, 价格,金额和会员卡号等。但是,在呈现给超市经营者的统计报表中,只包括这些信息
发表于:2023-12-08 浏览:416 TAG:
【MySql】select * 查询慢的原因和优化方法
‌使用SELECT *查询语句会导致查询效率低下的原因主要包括‌:它会查询所有的列和行数据,包括不需要的和重复的列,因此会占用更多的系统资源,导致查询效率低下。此外,由于...
发表于:2024-10-21 浏览:279 TAG: #mysql
【MySql】mysql explain 查询详解
MySQL 的 EXPLAIN 语句是一个强大的工具,用于分析和优化查询的执行计划。它提供了关于 MySQL 如何执行查询的详细信息,包括表的访问顺序、访问方法、使用的索引、连接类型等。以下是 EXPLAIN 查询的详细解释:
发表于:2025-02-21 浏览:80 TAG: #mysql
【MySql】mysql查询死锁
在MySQL数据库中,死锁是一个常见的问题,它发生在多个事务互相等待对方释放锁时。当一个事务试图修改已被另一个事务锁定的数据时,就会发生死锁。解决死锁的策略包括预防和检测。以下是一些处理MySQL死锁的方法:
发表于:2025-03-20 浏览:53 TAG: #mysql
【MySQL】 复合查询 | 内外连接
文章目录1. 复合查询unionunion all单行子查询多行子查询多列子查询in关键字all关键字any关键字多表笛卡尔积自连接在where子句使用子查询在from子句中使用子查询合并查询2. 内连接3. 外连接左外连接右外连接1. 复合查询多表笛卡尔积显示雇员名、雇员工资以及所在部门的名字由于员工 信息属于 emp表 而所在部门名字属于 dept表 数据来自不同的表,所以需要进行多表查询表示从 emp (员工表) 和dept (部门表)
发表于:2023-11-30 浏览:873 TAG: