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