当前位置: 首页 > news >正文

ICP 减少的是 不必要 的回表,而不是 所有 回表

  1. 必须回表的情况:
    • 如果查询需要返回索引中 未包含 的列,那么 无论是否开启 ICP,都必须进行回表操作。 这是因为索引本身只存储了部分列的数据,要获取其他列的数据,只能回到主表中查询。
    • 例如,如果索引只包含 first_name 和 last_name 列,而查询需要返回 hire_date 列,那么就必须进行回表。
  2. 可以避免回表的情况:
    • ICP 优化的正是这种情况。 当 WHERE 子句中包含可以使用索引中的列进行评估的条件时,ICP 可以在索引层先进行过滤,减少那些不满足条件的数据的回表操作

再次分析示例:

假设有 employees 表,包含 emp_nofirst_namelast_namehire_date 等列。

CREATE TABLE employees (emp_no INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),hire_date DATE
);-- 创建联合索引
CREATE INDEX idx_first_name_last_name ON employees (first_name, last_name);

执行以下查询:

SELECT * FROM employees WHERE first_name = 'John' AND last_name LIKE '%son%';

关键点:即使开启了 ICP,仍然需要回表!

  • 原因: 查询 SELECT * 需要返回 employees 表的所有列,包括 hire_date 列,而 idx_first_name_last_name 索引 不包含 hire_date 列。 因此,无论是否开启 ICP,都必须进行回表操作

  • ICP 的作用: ICP 在这个例子中的作用是,减少了需要回表的记录数量

    • 没有 ICP: 存储引擎找到所有 first_name = 'John' 的记录,然后 全部 回表,Server 层再过滤 last_name LIKE '%son%'
    • 有 ICP: 存储引擎找到 first_name = 'John' 的记录,同时 使用 last_name LIKE '%son%' 在索引层进行过滤,只有满足 last_name LIKE '%son%' 的记录才会被回表

总结:

  • ICP 并没有消除回表操作,而是减少了 不必要 的回表操作。
  • 如果查询需要返回索引中未包含的列,那么无论是否开启 ICP,都必须进行回表。
  • ICP 的价值在于,当 WHERE 子句中包含可以使用索引中的列进行评估的条件时,可以在索引层先进行过滤,减少那些不满足条件的数据的回表操作。

相关文章:

  • 《Java 并发编程实践》阅读笔记(一):线程重要性
  • 空洞卷积(膨胀卷积/扩张卷积)本质理解
  • Java 本地缓存的实现:常见的四种方式
  • 逻辑过期怎么设计
  • PclSharp ——pcl的c#nuget包
  • 自己的账号
  • 细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法
  • 软件测试|App测试相关面试题(3)
  • 2025年第二期DAMA认证考试通知已发布!
  • kali下maven 的安装与配置
  • 自动化构建工具:makemakefile
  • 求简单交错序列前N项和
  • 【Linux我做主】探秘gcc/g++和动静态库
  • RestControllerAdvice 和 ControllerAdvice 两个注解的区别与联系
  • 二十、FTP云盘
  • Operator 开发入门系列(一):Hello World
  • 【Java学习笔记】标识符和保留字
  • NLP高频面试题(四十七)——探讨Transformer中的注意力机制:MHA、MQA与GQA
  • 火山云如何运营
  • Vscode开发Vue项目NodeJs启动报错处理
  • 全文丨中华人民共和国民营经济促进法
  • 擦亮“世界美食之都”金字招牌,淮安的努力不止于餐桌
  • 日菲同意扩大安全合作,外交部:反对任何在本地区拉帮结派的做法
  • 铁路上海站今日预计发送旅客65.8万人次,同比增长超16%
  • 建行一季度净利833.51亿同比下降3.99%,营收降5.4%
  • 上海科创的三种品格