MYSQL基础07-索引条件下推ICP优化
官方地址:https://dev.mysql.com/doc/refman/8.0/en/index-condition-pushdown-optimization.html
官方文档一开头就写明:索引下推的作用是优化检索行。
那么索引下推是如何优化检索行的?
文档中给了解释:
-
没有ICP的情况下,通过索引直接定位数据行(会有索引失效的情景),然后把数据行返回给MYSQL服务器,服务器再根据WHERE其他条件对返回行数据过滤。
-
但是有ICP的情况下是怎么样的?那么只能通过索引中列来获取值,MYSQL服务器可以把索引相关列的判断下放到存储引擎,存储引擎判断索引列是否满足条件,再返回MYSQL服务器做其他操作。
这里面有几个核心点:
1.索引相关列的判断下放到存储引擎,这里的索引列是否满足WHERE条件判断。文档中并没明确指出where条件的索引必须是联合索引条件,或者单索引列,很多博客,都是以联合索引为例,并没有说明
- 经过测试,对应使用到的多个单索引也满足上面的要求
2.索引相关列下放,存储引擎判断,这也就意味着,对WHERE条件项所有索引列进行过滤,之后再回表查询数据。也就是很多博客中说的减少了回表次数
我们看一个官方文档给的例子:
- 联合索引 (zipcode, lastname, firstname)
SELECT * FROM people
WHERE zipcode='95054'
AND lastname LIKE '%etrunia%'
AND address LIKE '%Main Street%';
-
如果不使用ICP的步骤是这样的:
- 1.根据zipcode 索引查找到对应的主键
- 2.通过主键回表查找对应的行数据,再对行数据,按照WHERE条件进行过滤,保留或者淘汰行
-
使用ICP的步骤是这样的:
- 1.根据zipcode获取索引对应的主键
- 2.根据查找出来的主键,对WHERE条件中的索引列进行校验,不符合条件的跳过
- 3.符合WHERE条件的,根据主键进行回表查询,返回行数据
- 4.在根据剩余的WHERE 条件进行过滤,保留或者淘汰行
我们怎么知道有没有用到索引下推?
用EXPLAIN获取SQL的执行计划的时候,**在extra列会有Using Index Condition的输出信息**
以上就是对索引下推的简单了解。后续会根据学习进一步补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏