你说的 EXPLAIN 的 type,一般是指 MySQL 查询执行计划中 EXPLAIN 输出里的 type 列。它表示 MySQL 选择的连接类型,也就是访问数据表的方式,直接反映查询效率。
type 的几种常见类型详解(从最好到最差排序)类型 | 说明 | 性能评级 | 备注 |
|---|---|---|---|
system | 表只有一行(系统表),这是最优访问类型,几乎没有成本。 | 最优 | 仅一行数据的表,极少见 |
const | 表最多只有一行匹配,MySQL 将其作为常量读取。 | 非常好 | 主键或唯一索引查询,速度极快 |
eq_ref | 对每个来自前一个表的行,使用唯一索引查找,最多返回一行。 | 很好 | 多表关联中常见,使用主键或唯一索引 |
ref | 使用非唯一索引查找匹配的所有行,返回可能多于一行。 | 较好 | 常用索引扫描方式,性能不错 |
range | 通过索引范围扫描访问,通常用于 >、<、BETWEEN、IN 等条件。 | 一般 | 扫描范围索引部分行,效率中等 |
index | 全索引扫描,遍历整个索引。 | 较差 | 比全表扫描快(因为索引更小),但仍要遍历全索引 |
all | 全表扫描,MySQL 从头到尾遍历整个表。 | 最差 | 当无合适索引时出现,最耗性能 |
systemconsteq_refrefrangeWHERE col > 10。indexallall,保证有适当索引。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 删除。