你说的 EXPLAIN
的 type
,一般是指 MySQL 查询执行计划中 EXPLAIN
输出里的 type
列。它表示 MySQL 选择的连接类型,也就是访问数据表的方式,直接反映查询效率。
type
的几种常见类型详解(从最好到最差排序)类型 | 说明 | 性能评级 | 备注 |
---|---|---|---|
system | 表只有一行(系统表),这是最优访问类型,几乎没有成本。 | 最优 | 仅一行数据的表,极少见 |
const | 表最多只有一行匹配,MySQL 将其作为常量读取。 | 非常好 | 主键或唯一索引查询,速度极快 |
eq_ref | 对每个来自前一个表的行,使用唯一索引查找,最多返回一行。 | 很好 | 多表关联中常见,使用主键或唯一索引 |
ref | 使用非唯一索引查找匹配的所有行,返回可能多于一行。 | 较好 | 常用索引扫描方式,性能不错 |
range | 通过索引范围扫描访问,通常用于 >、<、BETWEEN、IN 等条件。 | 一般 | 扫描范围索引部分行,效率中等 |
index | 全索引扫描,遍历整个索引。 | 较差 | 比全表扫描快(因为索引更小),但仍要遍历全索引 |
all | 全表扫描,MySQL 从头到尾遍历整个表。 | 最差 | 当无合适索引时出现,最耗性能 |
system
const
eq_ref
ref
range
WHERE col > 10
。index
all
all
,保证有适当索引。const
、eq_ref
和 ref
是理想访问方式,性能最好。range
也可以接受,但要注意范围大小。index
和 all
都是遍历,性能相对较差。好的!这里帮你详细讲解 MySQL EXPLAIN
输出中其他几个关键字段的含义,以及它们对查询优化的帮助:
字段名 | 说明 |
---|---|
possible_keys | 该查询可能用到的索引列表。显示所有 MySQL 认为可能用到的索引,但不一定实际使用。 |
key | 实际使用的索引。如果是 NULL,说明没用到索引,通常性能较差。 |
key_len | 使用的索引长度(字节数),表示 MySQL 实际利用了索引的多少列和多少字节。 |
ref | 哪个列或常数与索引列比较。显示索引中被用来查找的列或常量。 |
rows | MySQL 估计要读取多少行数据,越小越好,直接影响查询速度。 |
Extra | 额外信息,比较重要,可能包含:- Using index:使用覆盖索引,性能更好。- Using where:使用了过滤条件。- Using temporary:需要用临时表,可能是排序或分组。- Using filesort:需要额外排序,性能较差。 |
possible_keys
和 key
,若 possible_keys
有索引但 key
却是 NULL
,考虑调整查询或索引。rows
越少越好,表明访问数据少,索引命中率高。Extra
显示 Using index
说明查询只从索引里读取数据,不访问表数据,性能很好。Using temporary
和 Using filesort
通常是性能瓶颈,要尽量优化查询结构和索引,避免这些操作。EXPLAIN SELECT id, name FROM users WHERE age = 30;php50 Bytes© 菜鸟-创作你的创作
输出示例:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | users | ref | age_index | age_index | 4 | const | 100 | Using where |
possible_keys
有 age_index
,表示这个索引可用。key
是 age_index
,实际用到了该索引。type
是 ref
,使用非唯一索引查找多行。rows
估计 100 行数据要读取。Extra
有 Using where
,说明查询还需要额外过滤(age=30)。好的!下面是一个指导你如何基于具体的 EXPLAIN
输出,逐步优化 SQL 查询的实战流程和建议。
type
字段,尽量避免 ALL
(全表扫描)ALL
,说明没有用到索引,优先考虑为查询涉及的字段添加合适索引。range
)可以接受,但尽量缩小扫描范围。key
字段,确认是否使用索引key = NULL
表示没用索引,需优化。possible_keys
有索引但未被使用,考虑:rows
字段,估计扫描行数应尽可能少Extra
字段Using filesort
表示 MySQL 需要额外排序,尽量避免。Using temporary
表示使用临时表,可能是复杂的 GROUP BY
或 DISTINCT
,需优化。Using index
表示覆盖索引,查询效率高。Using where
表示服务器端过滤,正常但越少越好。假设你的查询:
SELECT * FROM orders WHERE customer_id = 123 AND order_date > '2023-01-01' ORDER BY order_date DESC;php100 Bytes© 菜鸟-创作你的创作
type
是 ALL
,key
是 NULL
,Extra
有 Using filesort
。优化建议:
(customer_id, order_date)
建复合索引:CREATE INDEX idx_customer_orderdate ON orders(customer_id, order_date);
type
应变为 ref
或 range
,key
显示使用该索引,Using filesort
消失。ANALYZE TABLE table_name;
更新统计信息,帮助优化器更准确估计。SHOW INDEX FROM table_name;
查看现有索引情况。EXPLAIN FORMAT=JSON
获得更详细执行计划。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。