在使用 explain
分析 mysql 查询时,通常会关注以下几个关键字段,以了解查询的执行计划和性能瓶颈。以下是详细的解释:
1. explain 中需要关注的字段
id
:- 查询的标识符。如果是简单查询,值为 1;如果是子查询或联合查询,会有不同的值。
select_type
:- 查询的类型,例如
simple
(简单查询)、primary
(主查询)、subquery
(子查询)等。
- 查询的类型,例如
table
:- 查询涉及的表名。
partitions
:- 查询涉及的分区(如果表使用了分区)。
type
:- 最重要的字段之一,表示 mysql 如何访问表中的数据。常见的取值包括
all
、index
、range
、ref
等。
- 最重要的字段之一,表示 mysql 如何访问表中的数据。常见的取值包括
possible_keys
:- 可能使用的索引。
key
:- 实际使用的索引。
key_len
:- 使用的索引的长度(字节数)。
ref
:- 显示索引的哪一列被使用了,常见值为
const
、func
或null
。
- 显示索引的哪一列被使用了,常见值为
rows
:- 预估需要扫描的行数。
filtered
:- 表示查询条件过滤后的行数百分比。
extra
:- 额外的信息,例如
using where
、using index
、using temporary
等。
- 额外的信息,例如
2. type 字段的常见取值
system
:- 表中只有一行数据(系统表),是性能最好的类型。
const
:- 通过主键或唯一索引查找,最多返回一行数据。例如:
select * from table where id = 1;
- 通过主键或唯一索引查找,最多返回一行数据。例如:
eq_ref
:- 在联表查询中,使用主键或唯一索引进行匹配。例如:
select * from table1 t1 join table2 t2 on t1.id = t2.id;
- 在联表查询中,使用主键或唯一索引进行匹配。例如:
ref
:- 使用非唯一索引查找数据。例如:
select * from table where key_column = 'value';
- 使用非唯一索引查找数据。例如:
fulltext
:- 使用了全文索引。
ref_or_null
:- 类似于
ref
,但包含null
值的查找。例如:select * from table where key_column = 'value' or key_column is null;
- 类似于
index_merge
:- 使用了索引合并(index merge),即多个索引的结果合并。
unique_subquery
:- 在子查询中使用了唯一索引。
index_subquery
:- 在子查询中使用了非唯一索引。
range
:- 使用索引进行范围查找。例如:
select * from table where id between 1 and 100;
- 使用索引进行范围查找。例如:
index
:- 全索引扫描,即扫描整个索引树。
all
:- 全表扫描,性能最差,通常需要优化。
3. extra 字段的常见取值
using where
:- 使用了
where
条件过滤数据。
- 使用了
using index
:- 使用了覆盖索引(covering index),即查询的列都在索引中。
using temporary
:- 使用了临时表,通常发生在排序或分组时。
using filesort
:- 使用了文件排序,通常发生在无法使用索引排序时。
using join buffer
:- 使用了连接缓冲区(join buffer),通常发生在联表查询时。
impossible where
:where
条件永远为假,例如where 1 = 0
。
4. 工作中的关注点
type
:- 确保查询尽可能使用高效的类型(如
const
、eq_ref
、ref
、range
),避免all
(全表扫描)。
- 确保查询尽可能使用高效的类型(如
key
:- 确保查询使用了合适的索引。
rows
:- 预估扫描的行数越少,查询性能越好。
extra
:- 避免
using temporary
和using filesort
,这些通常意味着性能问题。
- 避免
5. 示例分析
explain select * from users where age > 30;
输出结果:
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | 1 | simple | users | all | null | null | null | null | 1000 | using where | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+
type
为all
,表示全表扫描,需要优化。extra
为using where
,表示使用了where
条件过滤。
6. 总结
- 重点关注
type
、key
、rows
和extra
字段。 - 确保查询使用了合适的索引,避免全表扫描和临时表。
- 根据
explain
的结果,调整查询语句或索引设计,优化性能。
到此这篇关于explain执行计划需要关注的几个关键字段的文章就介绍到这了,更多相关explain执行计划关键字段内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论