MySQL 中的回表

回表概念

定义:在使用非聚簇索引查询数据时,根据主键id到聚簇索引上查询数据的过程称为回表
优化:如果回表的次数变多,那查询的性能会变的差,需要优化

过程图解:
在非聚族索引上面根据索引过滤掉一部分数据,然后拿到主键id,再根据主键id到聚族索引查找数据的过程
请添加图片描述


避免回表

覆盖索引
  • 无需回表,查询需要返回的列信息直接从索引树获得,不再访问物理行数据

索引下堆
  • 索引下推(Index Condition Pushdown,简称 ICP),是 mysql 5.6 版本的新特性,它能减少回表查询次数,提高查询效率

  • 需要回表,存储引擎层根据索引尽可能的过滤数据,然后在返回给服务器层根据 where 其他条件进行过滤

  • mysql 架构图

  • mysql 服务层 负责 sql语法 解析、生成执行计划等,并调用存储引擎层执行数据的存储和检索

  • 索引下推是指将部分上层(服务层)负责的事情(如where查询),交给了下层(引擎层)去处理

  • 无 ICP 查询过程

    • 存储引擎读取索引
    • 根据索引中的主键值,定位并读取完整的行记录(回表)
    • 存储引擎把记录交给服务层去检测该记录是否满足where条件

  • ICP 查询过程

    • 存储引擎读取索引
    • 判断where条件部分能否用索引中的列来做检查
      • 条件不满足,处理下一行记录(丢弃,减少回表次数)
      • 条件满足,用索引中的主键去定位并读取完整的行记录(回表)
    • 存储引擎把记录交给服务层,服务层检测该记录是否满足WHERE条件的其余部分

mysql 配置索引下堆

  • ICP开启状态查询:SHOW VARIABLES LIKE '%optimizer_switch%';
  • 状态开启与关闭:SET optimizer_switch="index_condition_pushdown=off/on";

参考博客:https://www.cnblogs.com/xiaoxiaoman/p/16034684.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tytler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值