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

【MySql】mysql explain 查询详解

CrazyPanda发表于:2025-02-21 18:49:29浏览:64次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】表操作
第三篇:表操作#一、什么是表#表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段二、创建表#语法CREATE TABLE 表名( 字段名1  类型[(宽度)约束条件], 字段名1  类型[(宽度)约束条件], 字段名1  类型[(宽度)约束条件] )ENGINE=innodb DEFAULT CHARSET utf8; create
发表于:2024-06-21 浏览:270 TAG: #mysql
【MySQL】mysql中不推荐使用uuid或者雪花id作为主键的原因以及差异化对比
文章目录前言什么是UUID?什么是雪花ID?什么是MySql自增ID?优缺点对比应用场景总结写在最后优点缺点1.简单易用2.唯一性3.效率高4.索引效率高1.不适用于分布式系统2.不适用于需要保密的场景3.查询效率低优点缺点1.分布式环境下唯一性1.依赖于机器时钟2.存储空间较大3.查询效率低优点缺点1.全球唯一性2.无需数据库支持1.存储空间大2.索引效率低3.查询效率低UUID:雪花ID:MYS
发表于:2023-11-30 浏览:2076 TAG:
【MySQL】一文带你了解数据库约束
文章目录1. 约束类型2.PRIMARY KEY:主键约束3.FOREIGN KEY:外键约束4.NOT NULL:非空约束5.UNIQUE:唯一约束5.DEFAULT:默认值约束6.总结1. 约束类型作用: 数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。 常见的数据库约束包括:主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。外键约束:用于确保表之间数据的关系
发表于:2023-11-30 浏览:693 TAG:
【MySql】批量替换数据表中某字段的值
系统域名变更,需要把数据库存储的图片、文件等链接域名也替换掉,使用了文字替换的方法,在此记录一下:数据库:mysqlUPDATE user SET headimg = REPLACE(headimg, 'a.com', 'b.com');其中 user 是数据表,headimg是其中的字段,把headimg中'a.com'全部替换成'b.com',headimg中
发表于:2024-04-02 浏览:324 TAG:
【MySql】SQL boy的CRUD操作
文章目录增删查改:如何操作表中的数据?select|where|group by|havingfromorder bylimit插入数据记录插入查询结果添加数据删除数据修改数据查询数据增删查改:如何操作表中的数据?关于SQL的CRUD操作是很重要的,有些公司面试的时候会要求我们写一些SQL,我上次面试字节的时候就遇到了(手动狗头)。在我们的超市项目中,我们给用户设计好了一个数据库demo.goodsmaster,定义好了里面的字段以及各种约束,如下:mysql> desc&nbs
发表于:2023-12-08 浏览:398 TAG:
【MySQL】初识数据库
第一篇:初识数据库#一、数据库管理软件的由来#基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问一个文件仅仅只能存在于某一台机器上。 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题。 很不幸,这些假设都是你自己意淫出来的,上诉假设存在以下几个问题:1.程序所有的组件就不可能运行在一台机器上##因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器的性能
发表于:2024-06-21 浏览:257 TAG: #mysql
【MySql】如何进行数学计算、字符串处理和条件判断?
文章目录如何进行数学计算、字符串处理和条件判断?数学函数字符串函数条件判断函数总结如何进行数学计算、字符串处理和条件判断?MySQL 提供了很多功能强大,而且使用起来非常方便的函数,包括数学函数、字符串处理函数和条件判断函数等。在很多场景中 ,我们都会用到这些函数,比如说,在超市项目的实际开发过程中,会有这样的需求:会员积分的规则是一元积一分,不满一元不积分,这就要用到向下取整的数学函数 floor();在打印小票的时候,收银纸的宽度是固定的,怎么才能让打印的结果清晰而整齐呢?这个时候,就要用到
发表于:2023-12-07 浏览:374 TAG:
【MySql】MySQL备份与恢复全面指南
MySQL是目前最流行的关系型数据库管理系统之一,在企业级应用中被广泛使用。无论是开发者还是数据管理员,都需要了解MySQL备份与恢复的基本知识。备份和恢复不仅能够帮助企业保护数据,还能够使系统在不良情况下快速应对,尽可能使其恢复到正常运行状态。本文将详细介绍MySQL备份与恢复的操作步骤,并提供一些最佳实践,以帮助读者在保护其MySQL数据库方面走得更远。一、MySQL备份MySQL备份应该频繁地进行,以确保数据库永远处于最新状态。备份可以分为两种类型:物理备份和逻辑备份。1.物理备份物理备份
发表于:2024-01-24 浏览:290 TAG:
【MySQL】MySQL主从同步实现
要实现MySQL的主从同步,可以按照以下步骤来进行操作:1 配置主服务器确保主服务器的MySQL配置文件my.cnf或my.ini中启动了二进制日志中brinary.log,即设置了log-bin参数为ON。为主数据库创建一个用于复制的用户,并授予复制权限。例如使用以下明命令:Create USER 'repl'@'slave_ip_address' INENTIFIED BY 'password';Grant REPLACEACTION SLAV
发表于:2024-06-27 浏览:230 TAG:
【MySql】怎么利用聚合函数实现高效地分组统计?
文章目录聚合函数:怎么高效地进行分组统计?sum( )avg( ) & max( ) & min( )count( )聚合函数:怎么高效地进行分组统计?MySQL中有5种聚合函数较为常用,分别是求和函数sum(), 求平均函数avg(), 最大值函数max(), 最小值函数min()和计数函数count()。在超市项目中有一个需求是这样的:经营者提出,他们需要统计一个门店,每天、每个单品的销售情况,包括销售数量和销售金额等。这里涉及3个数据表,具体信息如下所示:销售明细表demo
发表于:2023-12-08 浏览:381 TAG: