当前位置:实例文章 » 其他实例» [文章]EXPLAIN查看MySQL执行计划返回列各项标识什么

EXPLAIN查看MySQL执行计划返回列各项标识什么

发布人:shili8 发布时间:2024-11-17 07:38 阅读次数:0

**理解 MySQL 执行计划**

在优化 MySQL 查询时,了解执行计划是非常重要的。执行计划提供了关于 MySQL 如何处理 SQL语句的详细信息,可以帮助我们找出瓶颈并进行优化。在本文中,我们将逐一解释每个列项及其意义。

**1. id**

`id` 列表示该行在整个执行计划中的顺序号。它是唯一标识符,用于区分不同阶段的操作。

sqlEXPLAIN SELECT * FROM employees;
+----+-------------+
| id | select_type |
+----+-------------+
|1 | SIMPLE |
+----+-------------+


在上面的例子中,`id` 为1,这意味着这是一个简单的 SELECT语句,没有任何子查询或 JOIN。

**2. select_type**

`select_type` 列表示该行对应的 SQL 操作类型。它可以是以下几种:

* `SIMPLE`: 简单的 SELECT语句,没有子查询或 JOIN。
* `DERIVED`: 子查询中的 SELECT语句。
* `UNION`: UNION 或 UNION ALL 的操作。
* `DEPENDENT SUBQUERY`:依赖于外部表达式的子查询。

sqlEXPLAIN SELECT * FROM employees WHERE id IN (SELECT id FROM customers);
+----+-------------+
| id | select_type |
+----+-------------+
|1 | SIMPLE |
|2 | DERIVED |
+----+-------------+


在上面的例子中,`select_type` 为 `SIMPLE` 和 `DERIVED`。第一个行对应的是外层的 SELECT语句,而第二个行对应的是子查询中的 SELECT语句。

**3. table**

`table` 列表示该行所涉及的表名。

sqlEXPLAIN SELECT * FROM employees, customers;
+----+---------+
| id | table |
+----+---------+
|1 | employees|
|2 | customers|
+----+---------+


在上面的例子中,`table` 列分别为 `employees` 和 `customers`。

**4. type**

`type` 列表示 MySQL 如何处理该行所涉及的表。它可以是以下几种:

* `const`: 表示该行只涉及一个常量值。
* `eq_ref`: 表示该行使用了唯一索引,且该索引对应的列与 WHERE 子句中的列相同。
* `ref`: 表示该行使用了非唯一索引,且该索引对应的列与 WHERE 子句中的列相同。
* `range`: 表示该行使用了范围索引。
* `index_merge`: 表示该行使用了多个索引进行合并。
* `unique_subquery`: 表示该行使用了唯一子查询。
* `index_subquery`: 表示该行使用了非唯一子查询。
* `sort_range`: 表示该行需要对某些列进行排序,然后再进行范围扫描。
* `sort`: 表示该行需要对某些列进行排序。
* `filesort`: 表示该行需要对某些列进行文件排序。
* `full_scan`: 表示该行需要全表扫描。

sqlEXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+


在上面的例子中,`type` 为 `const`,表示该行只涉及一个常量值。

**5. possible_keys**

`possible_keys` 列表示 MySQL 可以使用的索引列表。

sqlEXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+

SHOW INDEX FROM employees;
+-------+---------+-----------+----------+--------+--------+
| Table | Non_unique| Key_name | Seq_in_index| Column_name| Collation|
+-------+---------+-----------+----------+--------+--------+
| employees|0 | id |1 | id | A |
| employees|1 | name |1 | name | A |
+-------+---------+-----------+----------+--------+--------+

EXPLAIN SELECT * FROM employees WHERE name = 'John';
+----+--------+
| id | type |
+----+--------+
|1 | ref |
+----+--------+

SHOW INDEX FROM employees;
+-------+---------+-----------+----------+--------+--------+
| Table | Non_unique| Key_name | Seq_in_index| Column_name| Collation|
+-------+---------+-----------+----------+--------+--------+
| employees|0 | id |1 | id | A |
| employees|1 | name |1 | name | A |
+-------+---------+-----------+----------+--------+--------+


在上面的例子中,`possible_keys` 列分别为 `id` 和 `name`。

**6. key**

`key` 列表示 MySQL 使用的索引名称。

sqlEXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+

SHOW INDEX FROM employees;
+-------+---------+-----------+----------+--------+--------+
| Table | Non_unique| Key_name | Seq_in_index| Column_name| Collation|
+-------+---------+-----------+----------+--------+--------+
| employees|0 | id |1 | id | A |
| employees|1 | name |1 | name | A |
+-------+---------+-----------+----------+--------+--------+

EXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+


在上面的例子中,`key` 列为 `id`。

**7. key_len**

`key_len` 列表示 MySQL 使用的索引长度。

sqlEXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+

SHOW INDEX FROM employees;
+-------+---------+-----------+----------+--------+--------+
| Table | Non_unique| Key_name | Seq_in_index| Column_name| Collation|
+-------+---------+-----------+----------+--------+--------+
| employees|0 | id |1 | id | A |
| employees|1 | name |1 | name | A |
+-------+---------+-----------+----------+--------+--------+

EXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+


在上面的例子中,`key_len` 列为 `4`。

**8. ref**

`ref` 列表示 MySQL 使用的索引列名称。

sqlEXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+

SHOW INDEX FROM employees;
+-------+---------+-----------+----------+--------+--------+
| Table | Non_unique| Key_name | Seq_in_index| Column_name| Collation|
+-------+---------+-----------+----------+--------+--------+
| employees|0 | id |1 | id | A |
| employees|1 | name |1 | name | A |
+-------+---------+-----------+----------+--------+--------+

EXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+


在上面的例子中,`ref` 列为 `id`。

**9. rows**

`rows` 列表示 MySQL 扫描的行数。

sqlEXPLAIN SELECT * FROM employees WHERE id =1;
+----+--------+
| id | type |
+----+--------+
|1 | const |
+----+--------+

SHOW INDEX FROM employees;
+-------+---------+-----------+----------+--------+--------+
| Table | Non_unique| Key_name | Seq_in_index| Column_name| Collation|
+-------+---------+-----------+----------+--------+--------+
| employees|0 | id |1 | id | A |
| employees|1 | name |1 | name | A |
+-------+---------+-----------+----------+--------+--------+

EXPLAIN SELECT * FROM employees WHERE id

相关标签:mysql
其他信息

其他资源

Top