文章目录
-
-
- [1. system & const (最快)](#1. system & const (最快))
- [2. eq_ref (极快)](#2. eq_ref (极快))
- [3. ref (快)](#3. ref (快))
- [4. range (较快)](#4. range (较快))
- [5. index (慢)](#5. index (慢))
- [6. ALL (最慢)](#6. ALL (最慢))
- [💡 核心区别总结](#💡 核心区别总结)
-
记录一下我经常忘记的Type字段
在 EXPLAIN 的结果中,type 字段代表的是访问类型(Access Type),即 MySQL 决定如何查找表中的行。这是判断查询性能最直观的指标。
按照从好到差 的顺序,常用的 type 取值如下:
1. system & const (最快)
- system :表只有一行(等于系统表),这是
const类型的特例。 - const :通过索引一次就找到了。通常出现在使用**主键(primary key)或 唯一索引(unique index)**与常量进行等值比较时。
- 示例:
SELECT * FROM users WHERE id = 1;
- 示例:
2. eq_ref (极快)
- 通常出现在多表连接 中,连接条件使用的是主键或唯一索引。对于前一张表的每一行,在当前表中只有一行匹配。
- 示例:
SELECT * FROM a JOIN b ON a.id = b.a_id;(假设b.a_id是唯一索引)
- 示例:
3. ref (快)
- 使用的是非唯一性索引 (普通索引)或者联合索引的前缀扫描。可能会找到多行符合条件的记录。
- 示例:
SELECT * FROM users WHERE age = 25;(age是普通索引)
- 示例:
4. range (较快)
- 范围扫描 。利用索引检索给定范围内的行。
- 特征: 只要
WHERE子句中出现了BETWEEN,>,<,in,or等,且该列有索引,通常就是range。
- 特征: 只要
5. index (慢)
- Full Index Scan 。虽然也扫了索引,但它扫描了索引树的所有叶子节点。这通常比全表扫描快一点点,因为它不用去读数据行(通常伴随
Extra: Using index)。
6. ALL (最慢)
- Full Table Scan 。全表扫描,MySQL 遍历整个表来查找匹配的行。
- 评价: 数据量大时是灾难,必须优化。
💡 核心区别总结
system > const > eq_ref > ref > range > index > ALL一般来说,生产环境的查询至少要达到
range级别,最好能达到ref。