外观
如何判断一条 sql 语句有没有走索引?explain 语句有哪些字段,解释各字段的含义。
执行 EXPLAIN
+ SQL
语句:
EXPLAIN SELECT * FROM users WHERE age > 25;
关键字段判断:
type
:若值为ALL
,表示全表扫描(未走索引);若为ref
、range
、index
等,说明使用了索引。key
:显示实际使用的索引名称。若为NULL
,则未使用索引。rows
:预估扫描的行数。若行数远大于表中实际数据量,可能未走索引。Extra
:若出现Using index
,说明使用了覆盖索引;若出现Using where; Using index
,表示索引被部分使用。
EXPLAIN
的输出是一个表格,每一行代表查询计划中的一个步骤。输出列的含义如下:
列名 | 描述 |
---|---|
id | 查询的序列号,表示查询的顺序。如果查询中包含子查询或 JOIN ,可能会有多个 id 。 |
select_type | 查询的类型,例如 SIMPLE (简单查询)、SUBQUERY (子查询)、DERIVED (派生表)等。 |
table | 当前行所涉及的表名。 |
partitions | 匹配的分区(如果表被分区)。 |
type | 访问表的方式,例如 ALL (全表扫描)、index (索引扫描)、range (范围扫描)、ref (索引查找)、eq_ref (唯一索引查找)等。 |
possible_keys | 可能使用的索引。 |
key | 实际使用的索引。 |
key_len | 使用的索引长度(以字节为单位)。 |
ref | 用于索引查找的列或常量。 |
rows | 估计需要访问的行数。 |
filtered | 表示通过条件过滤的行数百分比。 |
Extra | 包含额外的执行信息,例如 Using where 、Using index 、Using filesort 等。 |