【MySql】mysql explain 查询详解
CrazyPanda发表于:2025-02-21 18:49:29浏览:68次
MySQL 的 EXPLAIN
语句是一个强大的工具,用于分析和优化查询的执行计划。它提供了关于 MySQL 如何执行查询的详细信息,包括表的访问顺序、访问方法、使用的索引、连接类型等。以下是 EXPLAIN
查询的详细解释:
使用方法
EXPLAIN SELECT ...;
或者更详细的格式:
EXPLAIN FORMAT=JSON SELECT ...;
输出列详解
-
id
- 数字标识符,表示查询中查询子句或表的顺序。较大的
id
通常表示更深层次的嵌套查询或子查询。 - 如果
id
相同,则执行顺序由上至下;如果不同,id
越大优先级越高,通常表示被嵌套或子查询。
- 数字标识符,表示查询中查询子句或表的顺序。较大的
-
select_type
- 查询的类型,表明查询中每个 SELECT 子句的类型(或操作类型)。
- 常见类型:
SIMPLE
:简单的 SELECT 查询,查询中不包含子查询或 UNION。PRIMARY
:查询中最外层的 SELECT。UNION
:UNION 中的第二个或后续的 SELECT 语句。DEPENDENT UNION
:UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。SUBQUERY
:在 SELECT 或 WHERE 列表中包含了子查询。DEPENDENT SUBQUERY
:子查询,依赖于外部查询。DERIVED
:派生表的 SELECT 查询,即子查询在 FROM 子句中。
-
table
- 表名或别名,显示当前步骤所访问的表。
- 有时显示为
derivedN
(派生表)或临时表名。
-
partitions
- 匹配的分区信息(如果表有分区)。
-
type
- 连接类型或访问类型,表示 MySQL 在找到所需行时使用的访问方式。访问类型越高效,查询性能越好。
- 常见类型:
system
:表只有一行(特殊情况的const
)。const
:表最多有一个匹配行,用于主键或唯一索引比较。eq_ref
:对于每个从表行,从主表里读取一个行(最常见于主键或唯一索引)。ref
:非唯一索引扫描,返回所有匹配某个单值的行。range
:只检索给定范围的行,使用一个索引来选择行。index
:全表扫描,只是扫描索引树(比ALL
快,因为通常索引比数据小)。ALL
:全表扫描,逐行操作,最慢的一种。
-
possible_keys
- 显示查询中能使用的索引。
-
key
- 实际使用的索引。如果为空,表示未使用索引。
-
key_len
- 使用的索引的长度(字节数)。长度越短,越高效。
-
ref
- 显示索引的哪一列或常量被用于查找值。
-
rows
- 估计为了找到所需的行而要读取的行数。这是一个估算值,并不总是准确。
-
filtered
- 显示估计的满足查询条件的行数百分比(针对存储引擎返回的行)。值越高,条件过滤效果越好。
-
Extra
- 包含不适合在其他列中显示但十分重要的额外信息。
- 常见内容:
Using where
:使用了 WHERE 条件来过滤行。Using temporary
:使用了临时表存储中间结果。Using filesort
:MySQL 需要额外的步骤来排序数据。Using index
:只通过索引树读取数据(索引覆盖),通常意味着高效查询。
使用 EXPLAIN
优化查询
通过分析 EXPLAIN
的输出,你可以识别查询中的潜在瓶颈,并采取相应的优化措施。例如:
- 确保查询使用了索引,尤其是主键和唯一索引。
- 避免全表扫描(
ALL
),尽量使用索引扫描(index
、range
、ref
等)。 - 优化 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中
- 【MySql】MySQL产生死锁的根本原因及解决方法
- 概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程一、 什么是死锁死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.二、 死锁产生的四个必要条件互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只
- 【MySql】mysql 数据库通过拷贝data文件恢复(物理恢复)
- 1、把data内数据库(MySQL5.7.26/data)拷贝到另外一台服务器一个文件夹是一个数据库,看是全部拷贝还是单个拷贝都可以2、 删除数据库下的.ibd(数据文件)和.frm(结构文件), db.opt不要删除(db.opt每个数据库文件只有一个) 3、执行建表sql,新建一样的表结构(新的要还原的数据库)把原数据库表结构导出一份,导入到新数据库4、执行下面语句删除数据库.ibd文件,从原数据库中拷贝.ibd过来;单表操作删除ALTER TABLE&nbs
- 【MySql】mysql查询死锁
- 在MySQL数据库中,死锁是一个常见的问题,它发生在多个事务互相等待对方释放锁时。当一个事务试图修改已被另一个事务锁定的数据时,就会发生死锁。解决死锁的策略包括预防和检测。以下是一些处理MySQL死锁的方法:
- 【MySQL】MySQL中的json操作
- 引言Mysql5.7版本以后提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。
- 【MySQL】初识数据库
- 第一篇:初识数据库#一、数据库管理软件的由来#基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问一个文件仅仅只能存在于某一台机器上。 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题。 很不幸,这些假设都是你自己意淫出来的,上诉假设存在以下几个问题:1.程序所有的组件就不可能运行在一台机器上##因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器的性能
- 【MySql】如何进行数学计算、字符串处理和条件判断?
- 文章目录如何进行数学计算、字符串处理和条件判断?数学函数字符串函数条件判断函数总结如何进行数学计算、字符串处理和条件判断?MySQL 提供了很多功能强大,而且使用起来非常方便的函数,包括数学函数、字符串处理函数和条件判断函数等。在很多场景中 ,我们都会用到这些函数,比如说,在超市项目的实际开发过程中,会有这样的需求:会员积分的规则是一元积一分,不满一元不积分,这就要用到向下取整的数学函数 floor();在打印小票的时候,收银纸的宽度是固定的,怎么才能让打印的结果清晰而整齐呢?这个时候,就要用到
栏目分类全部>