mysql explain对应字段解释
时间: 2023-08-25 15:09:31 浏览: 147
MySQL的`EXPLAIN`语句用于分析查询语句的执行计划,它返回一个描述查询执行计划的结果集。下面是`EXPLAIN`语句返回结果中常见的字段及其解释:
1. `id`: 查询执行的顺序,从大到小递增。值越小表示在查询计划中越靠前。
2. `select_type`: 查询类型,包括`SIMPLE`、`PRIMARY`、`SUBQUERY`等。`SIMPLE`表示简单查询,`PRIMARY`表示最外层查询,`SUBQUERY`表示子查询。
3. `table`: 表名,表示查询操作涉及的表。
4. `partitions`: 表示查询操作涉及的分区。
5. `type`: 表示访问类型,常见的取值有`ALL`、`index`、`range`等。`ALL`表示全表扫描,`index`表示通过索引进行查询,`range`表示使用索引范围查询。
6. `possible_keys`: 可能使用的索引列表。
7. `key`: 实际使用的索引。
8. `key_len`: 使用的索引长度,表示索引字段的字节数。
9. `ref`: 表示哪个字段或常数与索引一起使用。
10. `rows`: 估计的扫描行数。
11. `filtered`: 表示通过条件过滤后剩余数据的百分比。
12. `Extra`: 额外信息,包括`Using filesort`(使用文件排序)、`Using temporary`(使用临时表)等。
通过分析这些字段,可以帮助我们优化查询语句和索引设计,提升查询性能。
相关问题
mysql explain 使用
### 使用 MySQL 的 `EXPLAIN` 命令分析查询执行计划
理解 MySQL 组件的工作原理有助于更好地掌握服务器操作[^1]。为了有效利用 `EXPLAIN` 来分析查询执行计划,需熟悉其基本语法和输出字段。
#### 查询执行计划的基础概念
当发出 SQL 请求时,MySQL 会解析语句并创建相应的内部数据结构。对于涉及子查询的情况,系统会选择合适的优化策略,比如 “materialization” 或者 “EXISTS strategy”[^2]。
#### 如何使用 `EXPLAIN`
通过在任何 SELECT 类型的查询前加上关键字 `EXPLAIN` 可以获取该查询的执行计划:
```sql
EXPLAIN SELECT * FROM table_name WHERE condition;
```
这将返回一系列有关此查询的信息列,主要包括以下几个方面:
- **id**: 表示查询中不同部分的选择顺序编号。
- **select_type**: 描述查询的具体类型(简单查询、联合查询等)。
- **table**: 显示当前行所对应的表名。
- **partitions**: 如果存在分区,则显示匹配到哪些分区内。
- **type**: 访问方法,如全表扫描(all)、索引查找(index),范围(range)等。
- **possible_keys**, **key**, 和 **key_len**: 关于可用键以及实际使用的键及其长度说明。
- **ref**: 列出用于比较的关键字表达式的值。
- **rows**: 预估访问记录数。
- **filtered**: 按照条件过滤后的百分比估计。
- **Extra**: 提供额外的操作细节描述。
#### 实际案例展示
假设有一个名为 `employees` 的数据库表,并希望查看如下查询的执行情况:
```sql
EXPLAIN SELECT first_name, last_name FROM employees WHERE department_id = 5 AND salary > 70000;
```
上述命令将会给出关于这条特定查询是如何被执行的一系列信息,帮助识别潜在性能瓶颈所在之处。
#### 解读结果
仔细审查每一项指标可以帮助定位低效的地方。例如,“type”的值如果是 'all' 就意味着进行了完整的表格扫描;而如果看到 "Using where" 出现在 Extra 字段里则表明正在应用 WHERE 子句中的某些条件来进行筛选工作。
mySQl explain命令
### MySQL 中 EXPLAIN 命令的使用说明
#### 什么是 EXPLAIN?
`EXPLAIN` 是一种用于分析 SQL 查询性能的重要工具。它能够展示查询的执行计划,帮助开发者理解数据库如何处理特定的查询请求。通过 `EXPLAIN` 的输出,可以判断查询是否高效,是否存在未利用索引的情况,以及是否有不必要的全表扫描等问题。
---
#### 输出字段解释
以下是 `EXPLAIN` 命令的主要输出字段及其含义:
1. **id**
- 这一列表示查询中每个 SELECT 子句的序列号。如果存在子查询或多表连接,则可能会有多个 id 值[^1]。
2. **select_type**
- 描述查询的具体类型。常见的值包括:
- SIMPLE:简单查询,不包含子查询或联合。
- PRIMARY:最外层的查询。
- SUBQUERY:在 SELECT 或 WHERE 列表中的子查询。
- DERIVED:派生表(即 FROM 子句中的子查询)。
- UNION:表示第二个或后续的 UNION 成分[^3]。
3. **table**
- 显示当前正在操作的数据表名称。如果有 JOIN 操作,这里会列出参与联接的所有表名。
4. **partitions**
- 如果启用了分区功能,这一列将显示匹配哪些分区。如果没有启用分区,则此列为 NULL。
5. **type**
- 表明访问数据的方式,按效率从高到低排列如下:
- system/const:单行读取。
- eq_ref:唯一性索引查找。
- ref:非唯一性索引查找。
- range:范围扫描。
- index:全索引扫描。
- ALL:全表扫描(通常是最差的选择)。
6. **possible_keys**
- 列出了 MySQL 能够用来寻找记录的候选索引集合。注意,这里的索引不一定都会被真正使用[^2]。
7. **key**
- 实际上由 MySQL 决定使用的索引。如果没有选择任何索引,则其值为 NULL。可以通过提示关键字 FORCE INDEX、USE INDEX 或 IGNORE INDEX 来影响最终决策。
8. **key_len**
- 所选索引占用字节数量。一般而言,较短的关键长度更优。
9. **ref**
- 展示了与 key 字段对应的引用项,可能是某个常数或者是另一张表格里的某一栏位。
10. **rows**
- 预估为了完成此次查询所需要检查的总行数。数值越少越好。
11. **filtered**
- 经过条件过滤之后剩余的比例百分比。接近于 100% 更理想。
12. **Extra**
- 提供额外的信息,比如排序方式、临时文件创建情况等。某些常见标志包括 Using where, Using filesort 和 Using temporary 等。
---
#### 如何使用 EXPLAIN?
要查看某条 SQL 语句的执行计划,只需在其前加上关键词 `EXPLAIN` 即可。例如:
```sql
EXPLAIN SELECT * FROM users WHERE age > 30;
```
上述例子将会返回关于这条查询是如何被执行的相关信息。
---
#### 示例代码演示
假设有一个名为 `employees` 的员工表结构如下:
| Field | Type |
|-------------|--------------|
| emp_id | INT |
| first_name | VARCHAR(50) |
| last_name | VARCHAR(50) |
| department | VARCHAR(50) |
| salary | DECIMAL(10,2)|
现在想找出工资大于平均薪资的所有雇员名单并对其进行降序排列:
```sql
EXPLAIN EXTENDED
SELECT e.*
FROM employees AS e
WHERE e.salary > (SELECT AVG(salary) FROM employees);
```
这段脚本不仅揭示基本的检索路径而且还提供了扩展版本里更多的内部计算详情。
---
#### 总结
掌握好 `EXPLAIN` 工具可以帮助我们快速定位那些表现不佳的查询,并采取适当措施加以改进。无论是调整现有索引还是重构复杂查询逻辑都能显著提升整体应用效能。
---
阅读全文
相关推荐












