mysql5.7系列-索引下推(cover_index)

什么是索引下推

ICP(Index Condition Pushdown)是在MySQL 5.6版本上推出的查询优化策略,把本来由Server层做的索引条件检查下推给存储引擎层来做,以降低回表和访问存储引擎的次数,提高查询效率。

回顾下mysql的架构分层,连接层、server层、引擎层:

分析索引下推

索引下推是 MySQL 5.6引入了一种优化技术,默认开启,查看开启情况

select @@optimizer_switch

使用SET optimizer_switch = ‘index_condition_pushdown=off’;可以将其关闭。

SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';

官方文档中给的例子和解释如下: people表中(zipcode,lastname,firstname)构成一个索引SELECT * FROM people WHERE zipcode=’200030′ AND lastname LIKE ‘%etrunia%’ AND address LIKE ‘%Main Street%’;

我们先来创建这个表


CREATE TABLE people (`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',zipcode VARCHAR(10),lastname VARCHAR(50),firstname VARCHAR(50),address VARCHAR(200),PRIMARY KEY (`id`)
);
CREATE INDEX idx_zc_people_names ON people(zipcode,lastname, firstname);

再初始化一些数据

-- 常见姓名 + 地址 + 邮编
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('100000', '王', '伟', '北京市海淀区中关村大街1号');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('200030', '李', '娜', '上海市徐汇区淮海中路1234弄56号');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('510000', '张', '强', '广州市天河区体育西路789号');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('310012', '刘', '洋', '杭州市西湖区文三路456号');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('518000', '陈', '静', '深圳市福田区深南大道101号');-- 复姓 + 详细地址
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('266071', '欧阳', '晨曦', '青岛市市南区香港中路10号');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('215006', '司马', '浩然', '苏州市姑苏区干将东路288号');-- 少数民族姓名 + 地区特色地址
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('830000', '阿依', '古丽', '乌鲁木齐市天山区解放南路22号');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('550001', '扎西', '多吉', '拉萨市城关区北京中路12号');

我们执行下这个语句,分析下开启索引下推和不开启的区别

EXPLAIN select zipcode from people where zipcode='100000' and lastname like '%刘%' and address like '%海淀区%';

不开启索引下推

如果没有使用索引下推技术,则MySQL会通过zipcode=’200030’从存储引擎中查询对应的数据,返回到MySQL服务层,然后MySQL服务层基于lastname LIKE ‘%etrunia%’和address LIKE ‘%Main Street%’来判断数据是否符合条件。

关闭索引下推:SET optimizer_switch = 'index_condition_pushdown=off';

Extra的内容为:Using where ,代表着服务层的条件过滤 。

开启索引下推

如果使用了索引下推技术,则MYSQL首先会返回符合zipcode=’95054’的索引,然后根据lastname LIKE ‘%etrunia%’来判断索引是否符合条件。

如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

开启索引下推:SET optimizer_switch = 'index_condition_pushdown=on';

Extra的内容为:

Using index condition ,使用了索引下推 。

Using where ,代表着服务层的条件过滤(address字段没有在组合索引里面,所以需要在进行一次条件过滤) 。

当一条SQL使用到索引下推时,explain的执行计划中的extra字段中内容为:Using index condition

索引下推的作用

有了索引下推的优化,在满足一定条件下,存储 引擎层会在回表查询之前对数据进行过滤,可以减少存储引擎回表查询的次数。对于InnoDB聚簇索引来说,完整的行记录已经加载到缓存区了,索引下推也就没什么意义了。

附录

mysql的架构图

找了一圈都没找到5.7的架构图,只在官网找到了8.0的https://dev.mysql.com/doc/refman/8.0/en/pluggable-storage-overview.html

mysql5.7的innodb的架构图

https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

1. 内存中结构

• 缓冲池(Buffer Pool):缓存频繁访问的数据,减少磁盘I/O操作,提高查询性能。

• 变更缓冲区(Change Buffer):缓存对二级索引页的更改,当这些页不在缓冲池中时,以避免耗时的I/O操作。

• 自适应哈希索引(Adaptive Hash Index):为某些读操作提供快速的内存中查找机制,加速对频繁查询索引页的访问。

• 日志缓冲区(Log Buffer):保存要写入事务日志的更改,通过先写入内存再定期刷新到磁盘上的重做日志,来提高性能。

2. 磁盘上结构

•系统表空间(System Tablespace):存储变更缓冲区,InnoDB使用一个或多个数据文件来存储系统表空间。

• 各个表的独立表空间(File-per-table Tablespaces):每个InnoDB表都可以有自己的表空间。

• 通用表空间(General Tablespaces):可以容纳多个表的表空间。

• 撤销表空间(Undo Tablespaces):存储撤销日志,这些日志记录了事务进行中必须保留的旧数据版本。

• 临时表空间(Temporary Tablespaces):存储临时数据,如排序操作或哈希索引创建过程中的数据。

• 双写缓冲区(Doublewrite Buffer):保护数据不因崩溃而损坏,通过先写入双写缓冲区再写入表空间文件。

• 重做日志(Redo Log):记录数据变更,以便在系统崩溃后恢复数据。

• 撤销日志(Undo Logs):记录了事务进行中必须保留的旧数据版本,以支持事务回滚和MVCC。

资料参考:

1.https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

2.MySQL 架构_mysql架构图-CSDN博客

原创不易,若有问题,还请批评指正,感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88865.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络(基础概念)

计算机网络(基础概念)1 初识协议1.1 协议分层2 OSI七层模型2.1 物理层2.2 数据链路层2.3 网络层2.4 传输层2.5 应用层3 TCP/IP协议族3.1 什么是TCP/IP协议?3.1.1 OS与网络关系4 网络传输的基本流程4.1 局域网4.2 MAC地址5 跨网络传输5.1 IP地址6 Socket…

专题 JavaScript 函数基础

你将知道:函数声明和表达式函数声明和表达式之间的区别什么是匿名函数什么是 IIFE命名函数表达式this 关键字函数是调用该函数时执行的代码块 。函数声明和表达式让我们回顾一下它的语法:functionfunctionName(param1, param2, ..., paramN) {// Functio…

数据结构——优先队列(priority_queue)的巧妙运用

优先队列是一种相对高级的数据结构,它的底层原理是二叉堆。然而本篇不会执着于深挖其背后的原理,更主要的是理一下它在题目中的一些实用方法,帮助你更快的上手使用。 优先队列(priority_queue) 优先队列的特别之处就在于它可以自动进行排序&…

Java:继承和多态(必会知识点整理)

主要内容继承多态向上转型向下转型方法重写方法重载super关键字动态绑定封装访问控制构造方法规则一、继承 1. 概念: 一句话说就是:“共性抽取,代码复用”子类会将父类中的成员变量或者成员方法继承到子类中子类继承父类之后,必须…

基于esp32系列的开源无线dap-link项目使用介绍

基于esp32系列的开源无线dap-link项目使用介绍🔖有关esp32/8266相关项目:需要自己搭建编译环境: https://github.com/windowsair/wireless-esp8266-dap/tree/master🌿支持esp32/c3/s3,支持在线固件烧录,支持AP配网&…

深入了解linux系统—— 进程信号的产生

前言 进程在收到信号之后,可以立即处理,也可以在合适的时间再处理(1-31号普通信号可以不被立即处理) 信号不是被立即处理,信号就要被保存下来,让进程在合适的时间再去处理。 相关概念 在了解进程是如何保存…

【Bluedroid】蓝牙协议栈enable流程深度解析

本文详细剖析 Bluedroid 蓝牙功能启用的核心流程,从enable()函数触发开始,深入解析蓝牙协议栈的异步启动机制、核心协议模块初始化、硬件控制器绑定及状态同步全流程。重点阐述接口就绪性检查、异步线程管理、配置文件回调机制等关键环节,揭示…

各种开发语言主要语法对比

各类主流编程语言的语法有着显著差异,这些差异源于语言设计哲学(简洁性 vs 显式性)、应用领域(系统级、Web、数据科学)、运行方式(编译 vs 解释)以及支持的范式(面向对象、函数式、过…

小鹏汽车6月交付车辆34,611辆,同比增长224%

小鹏汽车-W(09868)发布公告,2025年6月,小鹏汽车共交付智能电动汽车34,611辆,同比增长224%,这标志着小鹏汽车已连续第八个月交付量超过了30,000辆。2025年第二季度,小鹏汽车共交付103,181 辆智能电动车,创下…

深入理解观察者模式:构建松耦合的交互系统

在软件开发中,我们经常遇到这样的场景:一个对象的状态变化需要通知其他多个对象,并且这些对象需要根据变化做出相应的反应。比如,用户界面中的数据变化需要实时反映到多个图表上,或者电商系统中的库存变化需要通知订单…

React强大且灵活hooks库——ahooks入门实践之常用场景hook

什么是 ahooks? ahooks 是一个 React Hooks 库,提供了大量实用的自定义 hooks,帮助开发者更高效地构建 React 应用。其中场景类 hooks 是 ahooks 的一个重要分类,专门针对特定业务场景提供解决方案。 安装 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget(一)1.QWidget2.enabled属性2.geometry🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Qt的学习】 📝📝本…

AIOT开发选型:行空板 K10 与 M10 适用场景与选型深度解析

前言 随着人工智能和物联网技术的飞速发展,越来越多的开发者、学生和爱好者投身于创意项目的构建。 在众多的开发板中,行空板 K10 和 M10 以其独特的优势脱颖而出。 本文旨在为读者提供一份详尽的行空板 K10 和 M10 对比分析,从适用场景、…

redis汇总笔记

语雀完整版: https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis笔记》 Redis 一般问题 Redis内存模型(I/O多路模型)多路复用IO如何解释 为什么Redis要使用单线…

STM32用PWM驱动步进电机

硬件介绍:连线:注意这里stp连的是pwm脉冲,dir连的是方向到时候代码pwm波形就是从这里来的,具体接线根据你的代码来注意要点:步进电机和舵机驱动是不一样的,它是根据步长来移动的,所以要开一个中…

力扣25.7.10每日一题——重新安排会议得到最多空余时间 II

Description 今天这道题和昨天类似,只是允许顺序变化。 Solution 把会议区间视作桌子,空余时间视作空位,我们要把一个桌子移到别的空位中。 初步想法是枚举桌子,找一个长度大于等于桌子长度的空位移过去。看上去,找…

IP报文分片与重组原理及实现分析

IP报文分片与重组原理及实现分析 引用: ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 当IP数据包大小超过MTU(最大传输单元)时,路由器/主机将其分割为多个片段传输,每个片段包含&…

[python]在drf中使用drf_spectacular

安装drf_spectacular 文档 pypi链接:https://pypi.org/project/drf-spectacular/ 文档链接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安装步骤 在环境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)

5.预训练模型跑分 回顾赛题 回顾赛题任务 挑战与难点: 标注数据少 ——> 半监督学习 or 数据增强 聚类分析噪点影响严重 回顾Baseline 问题: TF-IDF无法捕捉以下语义。聚类分析粗糙,未评估聚类质量。 提升方案: 分类任务…

SPSSPRO:数据分析市场SaaS挑战者的战略分析

目录 第一部分:执行摘要 第二部分:平台解构:产品、架构与用户体验 2.1 SaaS范式转移:架构与起源 2.2 功能能力:分析师的工具箱 2.3 “智能分析”的价值主张 第三部分:市场渗透与受众细分 3.1 目标用户…