一文秒懂MySQL 的索引下推
作者:佛祖让我来巡山
索引下推(Index Condition Pushdown)是指让索引参与更多的筛选工作,减少回表查询的次数,从而提高查询效率,本文介绍MySQL的索引下推相关知识,感兴趣的朋友跟随小编一起看看吧
秒懂 MySQL 索引下推
🎯 一句话概括
索引下推就是让索引多干点活,少打扰数据行
📖 通俗版解释
想象你在一家大公司找员工信息:
没有索引下推(传统方式)
你:人事小姐姐,我要找年龄大于25岁的所有员工
人事:好的,这是500个符合年龄要求的员工名单(只给了工号)
你:我还需要他们是北京分公司的
人事:那你自己去查这500个人的详细档案吧
你:😭 我要翻500份档案,一个个看是不是北京分公司的
问题:明明可以在人事那里就过滤掉,非要让你查500次档案
有了索引下推(优化后)
你:人事小姐姐,我要找年龄大于25岁且是北京分公司的员工
人事:好的,我直接帮你筛选,这是80个符合要求的员工名单
你:太好了!我只需要查80份档案
效果:人事(索引)帮你完成了额外筛选,你少查了420次档案
🔧 实际数据库例子
-- 员工表,索引在 (年龄, 分公司)
CREATE TABLE 员工表 (
工号 INT PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT,
分公司 VARCHAR(50),
工资 DECIMAL(10,2),
INDEX idx_年龄_分公司 (年龄, 分公司)
);
-- 传统查询(没有索引下推)
SELECT * FROM 员工表
WHERE 年龄 > 25
AND 分公司 LIKE '北京%';
-- 执行过程:
-- 1. 索引找到所有年龄>25的记录(500条)
-- 2. 拿着500个工号去查详细档案(500次)
-- 3. 在500条详细记录中筛选"北京分公司"-- 开启索引下推后 -- 执行过程: -- 1. 索引找到所有年龄>25的记录(500条) -- 2. 索引自己先筛选"分公司 LIKE '北京%'"(剩80条) -- 3. 只查80个员工的详细档案
💡 核心好处
1. 减少跑腿次数
- 原来:跑500次档案室
- 现在:跑80次档案室
- 节省84%的跑腿时间
2. 人事小姐姐更聪明了
以前人事只做最简单的筛选,现在她能做更多:
- ✅ 可以判断:
分公司 = '北京' - ✅ 可以判断:
分公司 LIKE '北京%' - ✅ 可以判断:
年龄 BETWEEN 20 AND 30 - ❌ 不能判断:
工资 > 10000(因为工资信息在档案里)
🏷️ 什么情况下能用?
能用的情况
-- 情况1:索引里有的信息,人事自己就能判断 -- 索引:(年龄, 城市) SELECT * FROM 用户 WHERE 年龄 > 20 AND 城市 LIKE '上海%'; -- ✅ 能用!城市在索引里 -- 情况2:部分条件在索引里 SELECT * FROM 订单 WHERE 用户ID = 1001 AND 状态 = '已支付'; -- ✅ 能用!两个都在索引里
不能用的情况
-- 情况1:要的信息索引里全有,不需要查档案 -- 索引:(姓名, 年龄) SELECT 姓名, 年龄 FROM 员工; -- ❌ 不需要!直接看名单就行 -- 情况2:条件不在索引里 -- 索引:(年龄, 城市) SELECT * FROM 用户 WHERE 年龄 > 20 AND 工资 > 10000; -- ❌ 不能用!工资不在索引里
🚀 实际效果对比
测试数据
- 员工表:100万条记录
- 年龄>25:50万人
- 北京分公司:5万人
查询速度对比
传统方式: ✓ 索引扫描:找到50万条记录(很快) ✓ 回表查询:查50万次详细数据(很慢!) ✓ 内存筛选:在50万条里找北京的(一般慢) ⏱️ 总耗时:3.2秒 索引下推: ✓ 索引扫描+筛选:直接找到5万条记录(稍慢一点) ✓ 回表查询:只查5万次详细数据(快很多!) ⏱️ 总耗时:0.8秒
提速4倍!
🎮 生活化类比
类比1:图书馆找书
传统:图书管理员只按"作者=鲁迅"找书,找到100本
你一本本翻看是不是"小说类"
下推:告诉管理员"作者=鲁迅 AND 类别=小说"
直接给你30本小说类比2:外卖筛选
传统:美团先按"距离<3km"筛选出50家店
你再一家家看有没有"评分>4.5"
下推:直接搜索"距离<3km AND 评分>4.5"
直接显示15家符合的店📝 简单总结
三句话记住索引下推
- 让索引多干活:索引不只是找位置,还能做筛选
- 减少回表次数:筛选好了再查详细数据,少查很多次
- 条件要在索引里:只能筛选索引中包含的条件
开启和查看
-- 默认就是开启的(MySQL 5.6+) -- 查看有没有用上 EXPLAIN SELECT ...; -- 看到"Using index condition"就是用了索引下推
🎯 什么时候最有效?
| 场景 | 效果 | 原因 |
|---|---|---|
| 大表筛选 | ⭐⭐⭐⭐⭐ | 减少大量回表 |
| 索引选择性高 | ⭐⭐⭐⭐ | 过滤掉大部分数据 |
| 查询条件多 | ⭐⭐⭐ | 提前过滤更有效 |
| 小表查询 | ⭐ | 本来就没多少数据 |
一句话:数据量越大,筛选条件越多,索引下推效果越明显!
🤔 思考题
如果你要查:
"年龄>30岁的北京分公司程序员"
但索引只有 (年龄, 分公司),没有职位字段。
问:索引下推能帮你过滤掉什么?什么过滤不了?
答案:
- ✅ 能过滤:年龄>30 且 分公司=北京
- ❌ 不能过滤:职位=程序员(需要查了档案才知道)
所以还是会先过滤掉非北京分公司的,再查档案看是不是程序员。
这就是索引下推的核心思想:能提前过滤的绝不留到后面!
到此这篇关于一文秒懂MySQL 的索引下推的文章就介绍到这了,更多相关mysql索引下推内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
