一文秒懂MySQL 的索引下推

 更新时间:2025年12月26日 08:47:23   作者:佛祖让我来巡山  
索引下推(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"就是用了索引下推

🎯 什么时候最有效?

场景效果原因
大表筛选⭐⭐⭐⭐⭐减少大量回表
索引选择性高⭐⭐⭐⭐过滤掉大部分数据
查询条件多⭐⭐⭐提前过滤更有效
小表查询本来就没多少数据

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

🤔 思考题

如果你要查:

"年龄&gt;30岁的北京分公司程序员"

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

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

答案

  • ✅ 能过滤:年龄>30 且 分公司=北京
  • ❌ 不能过滤:职位=程序员(需要查了档案才知道)

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

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

到此这篇关于一文秒懂MySQL 的索引下推的文章就介绍到这了,更多相关mysql索引下推内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL错误代码2058和2059的解决办法

    MySQL错误代码2058和2059的解决办法

    这篇文章主要介绍了MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,下面就来介绍一下解决方法,感兴趣的可以了解一下
    2025-03-03
  • 使用Canal实现MySQL主从同步的流程步骤

    使用Canal实现MySQL主从同步的流程步骤

    这篇文章主要介绍了如何使用Canal实现MySQL主从同步效果,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-04-04
  • Win10安装MySQL8压缩包版的教程

    Win10安装MySQL8压缩包版的教程

    这篇文章主要介绍了Win10安装MySQL8压缩包版的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • SQLyog连接不上mysql问题的解决方法(按照步骤,包解决)

    SQLyog连接不上mysql问题的解决方法(按照步骤,包解决)

    这篇文章主要介绍了SQLyog连接不上mysql问题的解决方法,文中给大家分析了SQLyog连接不上mysql的几种原因,并通过图文结合的方式给大家讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • MySQL中的触发器trigger用法解析

    MySQL中的触发器trigger用法解析

    这篇文章主要介绍了MySQL中的触发器trigger用法解析,触发器是由 事件来触发 某个操作,这些事件包括 INSERT、UPDATE、DELETE事件,事件就是指用户的动作或者触发某项行为,需要的朋友可以参考下
    2023-08-08
  • mySQL中LEN()与DATALENGTH()的区别

    mySQL中LEN()与DATALENGTH()的区别

    LEN返回指定字符串表达式的字符数,其中不包含尾随空格。DATALENGTH返回用于表示任何表达式的字节数。
    2011-03-03
  • win10下mysql 8.0.18 安装配置方法图文教程(windows版)

    win10下mysql 8.0.18 安装配置方法图文教程(windows版)

    这篇文章主要介绍了windows版的mysql 8.0.18 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 轻松上手MYSQL之SQL优化之Explain详解

    轻松上手MYSQL之SQL优化之Explain详解

    Explain是SQL分析工具中非常重要的一个功能,它可以模拟优化器执行查询语句,帮助我们理解查询是如何执行的,这篇文章主要给大家介绍了关于轻松上手MYSQL之SQL优化之Explain详解的相关资料,需要的朋友可以参考下
    2024-06-06
  • 一文详解MySQL索引(六张图彻底搞懂)

    一文详解MySQL索引(六张图彻底搞懂)

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,这篇文章主要介绍了MySQL索引的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • MySQL 实用命令

    MySQL 实用命令

    对于刚接触到mysql的朋友,需要的了解下,mysql的一些小技巧。
    2009-03-03

最新评论