MySQL type=ALL / index / ref / eq_ref / range 的实际含义对比
发布时间 - 2026-01-30 00:00:00 点击率:次type=ALL表示全表扫描,性能最差;type=index是全索引扫描,略优于ALL;type=ref用于非唯一索引等值匹配,可能返回多行;type=eq_ref用于唯一索引等值匹配,每次最多返回1行;type=range用于索引范围扫描,如BETWEEN、>、IN等。
type=ALL 表示全表扫描,性能最差但有时不可避免
当 EXPLAIN 输出中 type 为 ALL,说明 MySQL 正在逐行读取整张表来匹配条件——没有用上任何索引。这在小表或 SELECT * + 无 WHERE 的场景下常见,但数据量稍大(比如 >1 万行)就会明显拖慢查询。
容易踩的坑:
- 明明建了索引,但字段类型不一致(如
user_id是VARCHAR,而WHERE里写成数字WHERE user_id = 123),触发隐式转换导致索引失效 - 使用了函数或表达式:
WHERE YEAR(created_at) = 2025,无法走created_at索引 - 联合索引顺序错位:对
(a,b,c)建了索引,却只查WHERE c = ?,无法命中
type=index 和 type=ALL 的区别在于“是否按索引顺序遍历”
type=index 不是“用了索引”,而是“全索引扫描”:MySQL 会遍历整个索引的 B+ 树叶子节点,而不是聚簇索引的数据页。它比 ALL 略快(尤其当索引比表小很多时),但仍是 O(n) 复杂度。
典型场景:
-
SELECT count(*) FROM t(无WHERE),且存在非空索引(如主键) -
SELECT a FROM t ORDER BY a,而a上有索引但没WHERE条件 - 覆盖索引查询中,MySQL 决定扫完整个索引而非回表(比如
SELECT a,b FROM t WHERE a > 10,(a,b)是联合索引)
注意:type=index 并不等于“高效”,它只是比 ALL 少读部分数据页;如果索引本身很大(例如长文本前缀索引),性能可能和 ALL 接近。
type=ref / eq_ref 的核心差异在“是否能唯一确定一行”
ref 表示使用了非唯一索引(或唯一索引的非前导列),返回多行可能;eq_ref 则表示使用了唯一索引(主键或 UNIQUE),且等值匹配,每次最多返回 1 行——这是连接查询中最理想的类型之一。
常见对比:
-
SELECT * FROM orders o JOIN users u ON o.user_id = u.id:若u.id是主键,则对users表是eq_ref;若o.user_id只有普通索引,则对orders表是
ref -
WHERE status = 'paid',status是普通索引 →ref;WHERE id = 123,id是主键 →eq_ref(单表查询中少见,多见于 JOIN) -
ref可能因NULL值或范围条件退化为range,而eq_ref几乎只出现在主键/唯一键等值 JOIN 场景
type=range 对应索引上的范围扫描,边界清晰但未必高效
range 表示 MySQL 使用索引定位一个连续区间,比如 BETWEEN、>、IN、LIKE 'abc%'。它比 ref 多读若干索引节点,但仍是“有界扫描”。
关键细节:
-
IN列表过长(如几百项)可能导致优化器放弃走索引,降级为ALL -
LIKE以通配符开头('%abc')无法用索引,不会出现range - 联合索引中,只有最左前缀满足等值时,后续列才能用于
range:对(a,b,c),WHERE a = 1 AND b > 2 AND c = 3中,c实际不参与索引查找(b后已断开最左前缀) - 某些
OR条件会被重写为UNION,各分支单独判断type,整体EXPLAIN可能显示多个range
真正影响性能的往往不是 type 字面值,而是实际扫描的索引行数(rows)和是否回表(Extra 里有没有 Using index)。同一个 range,查 10 行和查 10 万行,代价天壤之别。
# mysql
# ai
# 区别
# 隐式转换
# sql
# NULL
# count
# select
# union
# using
# 主键
# 最多
# 遍历
# 仍是
# 使用了
# 则对
# 它比
# 这是
# 就会
# 多个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用景安虚拟主机手机版绑定域名建站?
Laravel如何处理和验证JSON类型的数据库字段
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Laravel怎么实现验证码(Captcha)功能
Laravel如何创建自定义中间件?(Middleware代码示例)
中山网站推广排名,中山信息港登录入口?
如何在建站主机中优化服务器配置?
历史网站制作软件,华为如何找回被删除的网站?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
网站制作大概多少钱一个,做一个平台网站大概多少钱?
QQ浏览器网页版登录入口 个人中心在线进入
HTML 中动态设置元素 name 属性的正确语法详解
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
黑客如何通过漏洞一步步攻陷网站服务器?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
javascript读取文本节点方法小结
昵图网官网入口 昵图网素材平台官方入口
如何在云服务器上快速搭建个人网站?
如何解决hover在ie6中的兼容性问题
什么是javascript作用域_全局和局部作用域有什么区别?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
浅述节点的创建及常见功能的实现
如何快速搭建自助建站会员专属系统?
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel怎么清理缓存_Laravel optimize clear命令详解
详解vue.js组件化开发实践
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
BootStrap整体框架之基础布局组件
黑客入侵网站服务器的常见手法有哪些?
如何在企业微信快速生成手机电脑官网?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Bootstrap CSS布局之列表
网站制作价目表怎么做,珍爱网婚介费用多少?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Python3.6正式版新特性预览
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel如何实现用户密码重置功能?(完整流程代码)
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
浅谈javascript alert和confirm的美化
上一篇:DISM系统备份还原指南
下一篇:程序化广告的五大优势
上一篇:DISM系统备份还原指南
下一篇:程序化广告的五大优势


