MySQL explain
type
字段表示了 MySQL 选择的表连接类型,也就是查询执行过程中扫描表的方式。连接类型的优劣顺序,从最佳到最差依次为:system
、const
、eq_ref
、ref
、range
、index
、ALL
。下面我们逐一进行介绍。
system
解释: 表示查询的表只有一行(等同于系统表)。这是最优的连接类型之一,因为它表示表非常小,几乎不需要扫描。
示例: 适用于查询静态配置或字典表。
const
解释: 表示表最多有一个匹配行,通常用于主键或唯一索引查询。这种连接类型非常高效。
示例: SELECT * FROM users WHERE id = 1;
eq_ref
解释: 对于每一个来自前一个表的行,MySQL 从当前表中读取一行。通常用于带有主键或唯一索引的联接查询。
示例: SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id;
ref
解释: 表示对前一个表的每一行进行索引查找。适用于使用非唯一索引或前缀索引的查询。
示例: SELECT * FROM orders WHERE customer_id = 1;
range
解释: 只检索给定范围内的行,使用一个索引来选择行。这种方式比全表扫描高效,但不如 ref
。
示例: SELECT * FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31';
index
解释: 全索引扫描,遍历整个索引树,而不访问表。通常比全表扫描(ALL
)更快,但仍然可能非常耗费资源。
示例: SELECT id FROM orders;
ALL
解释: 全表扫描,是最差的连接类型。MySQL 必须检查表中的每一行来找到匹配的记录。
示例: SELECT * FROM orders;