news 2026/4/30 19:03:38

【面试题】MySQL 的索引下推是什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【面试题】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:图书馆找书

传统:美团先按"距离<3km"筛选出50家店 你再一家家看有没有"评分>4.5" 下推:直接搜索"距离<3km AND 评分>4.5" 直接显示15家符合的店

类比2:外卖筛选

传统:美团先按"距离<3km"筛选出50家店 你再一家家看有没有"评分>4.5" 下推:直接搜索"距离<3km AND 评分>4.5" 直接显示15家符合的店

📝 简单总结

三句话记住索引下推

  1. 让索引多干活:索引不只是找位置,还能做筛选

  2. 减少回表次数:筛选好了再查详细数据,少查很多次

  3. 条件要在索引里:只能筛选索引中包含的条件

开启和查看

-- 默认就是开启的(MySQL 5.6+) -- 查看有没有用上 EXPLAIN SELECT ...; -- 看到"Using index condition"就是用了索引下推

🎯 什么时候最有效?

一句话:数据量越大,筛选条件越多,索引下推效果越明显!

🤔 思考题

如果你要查:

"年龄>30岁的北京分公司程序员"

但索引只有(年龄, 分公司),没有职位字段。

问:索引下推能帮你过滤掉什么?什么过滤不了?

答案

  • ✅ 能过滤:年龄>30 且 分公司=北京

  • ❌ 不能过滤:职位=程序员(需要查了档案才知道)

所以还是会先过滤掉非北京分公司的,再查档案看是不是程序员。

这就是索引下推的核心思想:能提前过滤的绝不留到后面

文章转载自:佛祖让我来巡山

原文链接:https://www.cnblogs.com/sun-10387834/p/19371453

体验地址:http://www.jnpfsoft.com/?from=001YH

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 8:47:03

安捷伦 Keysight 16195B 是德 16195B 校准套件

是德科技 16195B校准套件‌主要用于高频阻抗测量仪的校准&#xff0c;特别是在7 mm接头平面上进行校准。该套件包含以下组件&#xff1a; E4991-60021 &#xff08;SHORT&#xff09;、 E4991-60022 &#xff08;OPEN&#xff09;以及一个50欧姆的负载&#xff0c;频率范围为DC…

作者头像 李华
网站建设 2026/4/30 6:57:51

力科Teledyne LeCroy PP024 示波器探头 PP024-2

力科PP024探头 是一款无源衰减探头&#xff0c;适用于示波器&#xff0c;具有10:1的衰减值和500MHz的带宽。‌ 该探头的输入电阻为10MΩ&#xff0c;最大电压值为CAT I 500V和CAT II 400V&#xff0c;输入电容为10pF&#xff0c;电缆长度为51.181英寸&#xff08;约1300毫米&am…

作者头像 李华
网站建设 2026/4/29 15:45:08

springboot旅游旅行攻略网站的设计与实现vue

目录系统架构设计核心功能模块技术实现要点扩展功能设计部署方案开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统架构设计 SpringBoot旅游旅行攻略网站采用前后端分离架构&#xff0c;后端使用SpringBoot框架提供RESTful A…

作者头像 李华
网站建设 2026/4/20 8:38:38

【dz-670】基于单片机的智能化光伏发电监控与管理系统设计

基于单片机的智能化光伏发电监控与管理系统 摘要&#xff1a;当前全球能源需求持续增长&#xff0c;同时对环境保护的重视程度也日益提高&#xff0c;光伏发电作为一种有清洁、可再生特性的能源技术&#xff0c;已获得广泛应用&#xff0c;本文设计了一种以单片机为基础的智能化…

作者头像 李华
网站建设 2026/4/30 12:46:10

ZUI15 平板充电样式怎么改?个性化设置教程来了!

对于使用联想 ZUI15 系统平板的用户来说&#xff0c;细节处的个性化定制总能让设备更具专属感。充电时的显示样式看似是小细节&#xff0c;却能在日常使用中带来不一样的仪式感 —— 单调的默认样式看久了难免乏味&#xff0c;不少小伙伴都在寻找更改充电样式的方法&#xff0c…

作者头像 李华
网站建设 2026/4/25 14:19:03

计算机毕设Java基于微信小程序的社区志愿者服务管理系统 基于微信小程序的社区志愿服务管理平台的Java开发实践 微信小程序环境下Java实现的社区志愿者服务管理系统设计

计算机毕设Java基于微信小程序的社区志愿者服务管理系统76x8l9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着社会的快速发展&#xff0c;社区志愿服务在促进社区和谐与提…

作者头像 李华