mysql explain命令是分析查询执行计划的核心工具,其中type字段表示表的连接类型,直接决定了查询的数据检索效率,是判断SQL性能的关键指标。不同的type取值对应不同的数据访问方式,性能从高到低有明显区分。

常见的mysql explain type连接类型
mysql explain的type字段常见取值按性能从优到劣排列为:system、const、eq_ref、ref、range、index、all,下面通过具体示例逐一说明。
1. system与const类型
system是const的特例,仅当表只有一行数据时出现,实际场景中很少遇到。const类型表示通过主键或唯一索引的等值查询,最多只返回一行数据,性能最优。
首先创建测试表并插入数据:
-- 创建用户表,id为主键
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
INDEX idx_age (age)
);
-- 插入测试数据
INSERT INTO user VALUES (1, '张三', 20);
INSERT INTO user VALUES (2, '李四', 25);
INSERT INTO user VALUES (3, '王五', 30);
执行以下查询语句查看explain结果:
EXPLAIN SELECT * FROM user WHERE id = 1;
此时type字段值为const,因为id是主键,等值查询只会匹配到唯一一行数据。
2. eq_ref类型
eq_ref类型出现在多表关联查询中,关联条件使用了被驱动表的主键或唯一非空索引,且关联条件是等值匹配,每一行驱动表的数据最多匹配一行被驱动表的数据。
创建订单表作为关联表:
-- 创建订单表,user_id关联用户表的id
CREATE TABLE order_info (
order_id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
UNIQUE KEY uk_user_id (user_id)
);
-- 插入测试数据
INSERT INTO order_info VALUES (1001, 1, 199.99);
INSERT INTO order_info VALUES (1002, 2, 299.99);
执行关联查询:
EXPLAIN SELECT * FROM user u JOIN order_info o ON u.id = o.user_id;
如果order_info表的user_id是唯一索引,且关联条件为等值匹配,那么被驱动表order_info的type会显示为eq_ref。
3. ref类型
ref类型表示使用非唯一索引的等值查询,可能返回多行匹配的数据,常见于普通索引的等值查询场景。
执行以下查询:
EXPLAIN SELECT * FROM user WHERE age = 20;
age字段是普通索引idx_age,等值查询会匹配所有age为20的行,此时type为ref。
4. range类型
range类型表示使用索引进行范围查询,常见的范围操作符包括BETWEEN、IN、>、<、>=、<=等,索引被用于检索给定范围内的数据。
执行范围查询语句:
EXPLAIN SELECT * FROM user WHERE id BETWEEN 1 AND 3;
此时id是主键索引,查询使用范围条件,type为range。
5. index类型
index类型表示全索引扫描,即遍历整个索引树来获取数据,虽然比全表扫描好,但依然需要扫描全部索引节点,性能较差。
执行以下查询:
EXPLAIN SELECT id FROM user;
查询的字段id是主键索引的组成部分,不需要回表查询,直接扫描整个主键索引树,此时type为index。
6. all类型
all类型表示全表扫描,即遍历整个表的所有数据行来匹配查询条件,是性能最差的连接类型,当表数据量较大时应尽量避免。
执行没有使用索引的查询:
EXPLAIN SELECT * FROM user WHERE name = '张三';
name字段没有创建索引,查询需要扫描全表所有行,此时type为all。
不同type类型的性能对比
我们可以通过下表直观看到不同连接类型的性能差异:
| type类型 | 触发条件 | 性能表现 |
|---|---|---|
| const | 主键或唯一索引等值查询 | 最优,仅扫描一行 |
| eq_ref | 多表关联,被驱动表使用主键或唯一索引等值关联 | 极优,每行驱动表数据最多匹配一行被驱动表数据 |
| ref | 普通索引等值查询 | 优秀,匹配多行但使用索引 |
| range | 索引范围查询 | 良好,仅扫描索引范围内的数据 |
| index | 全索引扫描 | 较差,扫描整个索引树 |
| all | 全表扫描,无可用索引 | 最差,扫描全表所有数据 |
优化建议
在实际开发中,我们应尽量避免type为all和index的查询:
- 为查询条件的字段创建合适的索引,避免全表扫描
- 尽量使用主键或唯一索引进行等值查询,让type达到const级别
- 多表关联时,确保关联字段在被驱动表上有索引,尽量达到eq_ref或ref级别
- 范围查询时合理设计索引,让查询能使用range类型而不是全索引扫描
通过explain命令的type字段,我们可以快速判断查询的性能瓶颈,针对性地进行索引优化,提升SQL的执行效率。
mysql_explaintype连接类型sql性能优化索引使用查询执行计划修改时间:2026-06-09 15:42:24