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

【MySql】mysql explain 查询详解

CrazyPanda发表于:2025-02-21 18:49:29浏览:68次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】批量替换数据表中某字段的值
系统域名变更,需要把数据库存储的图片、文件等链接域名也替换掉,使用了文字替换的方法,在此记录一下:数据库:mysqlUPDATE user SET headimg = REPLACE(headimg, 'a.com', 'b.com');其中 user 是数据表,headimg是其中的字段,把headimg中'a.com'全部替换成'b.com',headimg中
发表于:2024-04-02 浏览:327 TAG:
【MySql】MySQL产生死锁的根本原因及解决方法
概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程一、 什么是死锁死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.二、 死锁产生的四个必要条件互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只
发表于:2024-03-13 浏览:282 TAG:
【MySql】mysql 数据库通过拷贝data文件恢复(物理恢复)
1、把data内数据库(MySQL5.7.26/data)拷贝到另外一台服务器一个文件夹是一个数据库,看是全部拷贝还是单个拷贝都可以2、 删除数据库下的.ibd(数据文件)和.frm(结构文件), db.opt不要删除(db.opt每个数据库文件只有一个) 3、执行建表sql,新建一样的表结构(新的要还原的数据库)把原数据库表结构导出一份,导入到新数据库4、执行下面语句删除数据库.ibd文件,从原数据库中拷贝.ibd过来;单表操作删除ALTER TABLE&nbs
发表于:2024-01-24 浏览:321 TAG:
【MySql】mysql查询死锁
在MySQL数据库中,死锁是一个常见的问题,它发生在多个事务互相等待对方释放锁时。当一个事务试图修改已被另一个事务锁定的数据时,就会发生死锁。解决死锁的策略包括预防和检测。以下是一些处理MySQL死锁的方法:
发表于:2025-03-20 浏览:36 TAG: #mysql
【MySQL】MySQL中的json操作
引言Mysql5.7版本以后提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。
发表于:2024-07-26 浏览:245 TAG:
【MySQL】初识数据库
第一篇:初识数据库#一、数据库管理软件的由来#基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问一个文件仅仅只能存在于某一台机器上。 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题。 很不幸,这些假设都是你自己意淫出来的,上诉假设存在以下几个问题:1.程序所有的组件就不可能运行在一台机器上##因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器的性能
发表于:2024-06-21 浏览:262 TAG: #mysql
【MySQL】mysql百万级数据表翻页查询特别慢的优化方式
最近遇到了mysql百万级数据表翻页查询特别慢的问题,查询第一页的时候,特别快,翻页跨度特别大的时候,翻页查询就会特别慢
发表于:2024-11-14 浏览:250 TAG: #mysql
【MySql】如何进行数学计算、字符串处理和条件判断?
文章目录如何进行数学计算、字符串处理和条件判断?数学函数字符串函数条件判断函数总结如何进行数学计算、字符串处理和条件判断?MySQL 提供了很多功能强大,而且使用起来非常方便的函数,包括数学函数、字符串处理函数和条件判断函数等。在很多场景中 ,我们都会用到这些函数,比如说,在超市项目的实际开发过程中,会有这样的需求:会员积分的规则是一元积一分,不满一元不积分,这就要用到向下取整的数学函数 floor();在打印小票的时候,收银纸的宽度是固定的,怎么才能让打印的结果清晰而整齐呢?这个时候,就要用到
发表于:2023-12-07 浏览:377 TAG:
【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 浏览:2098 TAG:
【MySql】json字段内数据求和
首先,我们需要使用JSON_EXTRACT函数来解析JSON数据。假设我们的数据表名为data_table,JSON数据字段名为json_data,需要查询的字段为field_name。```sql SELECT JSON_EXTRACT(json_data, '$.field_name') AS extracted_field FROM data_table;### 步骤2:使用JSON函数提取数组内字段 如果字段是一
发表于:2024-09-18 浏览:209 TAG: #mysql