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

原理这就是索引下推呀

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

索引下推是之前面试的时候遇到的一个面试题,当时没有答上来,今天来学习一下。

介绍索引下推之前先看一下MySQL基础架构。

MySQL通常被分为两层架构,即Server层和存储引擎层。Server层处理查询解析、分析、优化、缓存以及与客户端的交互等操作,而存储引擎层负责数据的存储和提取。MySQL支持多种不同的存储引擎,包括InnoDB、MyISAM、Memory等。通过使用不同的存储引擎,可以实现不同的功能和性能特点。

MySQL基础架构图

什么是索引下推

索引下推(Index Condition Pushdown,简称ICP) 是 MySQL 5.6 开始引入的一项优化技术,可以在执行查询时将过滤条件 下推到存储引擎层 。索引下推技术允许存储引擎使用非键列索引来筛选不符合条件的行,减少回表(访问主键索引)的次数,从而提高查询性能。

什么是回表

二级索引(又称非聚簇索引)并不包含行记录的全部数据,二级索引上除了当前列以外还包含一个主键,通过这个主键来查询聚集索引上对应的数据。当查询除索引以外的其他数据时,由于数据无法通过二级索引获取就需要通过主键来找到完整的行记录,这就是回表。

索引下推的条件

索引下推的适用条件如下:

  1. ICP仅适用于 InnoDBMyISAM 引擎,包括它们的分区表。
  2. ICP适用于执行计划type是 range, ref, eq_refref_or_null 的查询语句
  3. ICP 只适用于二级索引
  4. 存储函数不能使用索引下推,因为存储引擎无法调用存储函数
  5. 引用子查询条件不能使用索引下推
  6. 如果索引列的数据类型是 BLOBTEXT 等大数据类型,则索引下推无法使用。
  7. 索引下推只适用于 联合索引

怎么判断一个查询语句是否使用了索引下推

可以通过 MySQL 数据库的慢查询日志或查询性能分析工具来判断一个查询语句是否使用了索引下推。以下是一些常用的方法:

  1. 查看慢查询日志 。在 MySQL 数据库中,可以开启慢查询日志功能来记录执行时间超过指定阈值的查询语句。在慢查询日志中,可以查看查询语句的执行计划,如果执行计划中包含 Using index condition 等信息,则说明该查询语句使用了索引下推。
  2. 使用 EXPLAIN 命令 。在 MySQL 数据库中,可以使用 EXPLAIN 命令来查看查询语句的执行计划。如果执行计划 Extra 中包含 Using index condition 等信息,则说明该查询语句使用了索引下推。
  3. 使用查询性能分析工具 。可以使用一些查询性能分析工具,如 pt-query-digest 等,来分析 MySQL 数据库的查询性能。这些工具可以自动识别使用了索引下推的查询语句,并给出相应的分析结果。

如何使用索引下推?

索引下推是 默认开启 的,可以通过 optimizer_switch 系统变量来控制。如果要关闭索引下推,可以执行以下命令:

set optimizer_switch='index_condition_pushdown=off';

如果要开启索引下推,可以执行以下命令:

set optimizer_switch='index_condition_pushdown=on';

查看是否开启索引下推,可以执行如下命令:

SHOW VARIABLES LIKE 'optimizer_switch';

索引下推

索引下推的流程

  1. 查询语句中的 WHERE 子句包含一个或多个过滤条件。
  2. 如果查询语句中使用了索引,则 MySQL 数据库会将过滤条件下推到存储引擎层,以便在存储引擎中进行过滤,减少返回的记录数量。
  3. 如果过滤条件中包含了非索引列的比较操作符,则 MySQL 数据库会将这些条件下推到存储引擎层进行处理,这种操作称为索引下推优化。

如果没有使用索引下推,MySQL 数据库需要先扫描所有的数据行,然后再根据 WHERE 子句中的条件进行筛选,这会导致返回的数据量较大,查询效率较低。而使用索引下推可以在存储引擎层级别上对数据进行过滤,减少不必要的数据扫描,提高查询效率。

下面举个例子说明一下:

有下面这样一张表:

CREATE TABLE `users_copy` (`Id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(32) DEFAULT NULL COMMENT '名称',`age` tinyint(3) DEFAULT NULL COMMENT '性别',`create_date` datetime DEFAULT NULL COMMENT '创建时间',`is_deleted` bit(1) NOT NULL DEFAULT b'0',PRIMARY KEY (`Id`) USING BTREE,KEY `idx_age_name` (`age`,`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统用户表'

其中agename组成联合索引。

有下面这样一条SQL语句:

SELECT * FROM users_copy WHERE age = 18 and `name` LIKE '%M%';

在不使用索引下推情况下执行阶段的流程如下:

  1. 利用索引从存储引擎中查询age = 18的用户数据,查询完成返回给 server层
  2. 由于使用的是二级索引且没有索引覆盖,所以 server层 会取第一次查询到的每条数据的主键值,然后根据主键回表再去存储索引查询一次获取完整行数据。
  3. 回表查完之后把完整行数据的返回到 server层 再判断 LIKE '%M%'的数据。
  4. 最后返回给客户端。

下面看一下没有开启索引下推情况下的EXPLAIN执行计划:

查询计划中使用了 Using where 表示使用了回表来查询数据。

使用索引下推情况下执行阶段的流程如下:

  1. MySQL把查询条件 age = 18 and name LIKE '%M%' 下推到存储引擎
  2. 然后查询name以M开头的用户数据,查询完并不返回给 server层 而是会检查 name 列只返回 name LIKE '%M%'的数据,其他不符合条件的数据不返回
  3. 最后返回给 server层 ,经过 server层 处理之后再返回给客户端。

下面看一下开启索引下推情况下的EXPLAIN执行计划:

Img

查询计划中使用了 Using index condition 表示使用了索引下推查询数据。

以上的例子就好比你同事要在代码层(非SQL代码)根据nameage查用户列表,他先通过for循环根据age去一个一个数据库查询到完整的数据,然后再判断age是否是符合条件,符合条件就放到结果集中。
而你技术远在他之上一眼就看出这段代码要优化,就让他把nameage两个查询条件一起传到数据库层进行查询,然后再返回用户列表,这样减少了查询次数和IO,提高了查询性能。

总结

需要注意的是,使用索引下推优化时,需要注意数据类型的兼容性问题,以避免因为类型不兼容导致查询结果不准确。此外,不同的存储引擎对索引下推的支持程度也不同,需要针对具体的存储引擎进行优化和调整。

索引下推到此就结束了,今天又学了一个知识点。关注我学习更多知识点。

相关文章:

原理这就是索引下推呀

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 索引下推是之前面试的时候遇到的一个面试题,当时没有答上来,今天来学习一下。 介绍索引下推之前先看一下MySQL基…...

个人通讯录(二)

个人通讯录(二) 需求: 通讯录(phone)用来保存若干个联系人的信息,且可以按照联系人姓名的拼音升序排序。要求通讯录提供一下功能: 1.添加联系人信息 2.删除指定联系人信息 3.修改指定联系人…...

DockerK8S常见面试知识

Docker docker的工作原理 docker是一个client-server结构的系统,docker守护进程运行在宿主机上,守护进程从客户端接受命令并管理运行在主机上的容器,容器是一个运行时环境,这就是我们说的集装箱 docker组成部分 1、docker cli…...

tcpdump arping nsenter

tcpdump 参数说明 tcpdump 是一款常用的网络抓包工具,它可以捕获网络数据包并进行分析。tcpdump 的参数非常多,下面是一些常用的参数说明: -i:指定要监听的网络接口,如 -i eth0。 any-n:禁用地址解析&…...

Python - 简单快速回忆基础语法

Python 是一种高级编程语言,易学易用 以下是 Python 基础语法的概述: 注释 Python 使用 # 符号来注释代码行。代码行 # 后的所有内容都将被认为是注释,不会被解释器执行,只是对代码的注释说明 # 这是一条注释 print("Hel…...

蓝牙耳机接打电话哪个比较好?接打电话最好的蓝牙耳机

技术已经发展到如此程度,耳机可以淹没嘈杂环境中不断出现的杂音,同时还能让我们在通话、音乐和娱乐方面保持清晰,既然如此,我们就来整理一下2023年适合通话和娱乐的无线耳机清单。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#x…...

DeepSORT中的卡尔曼滤波

本文是看了DeepSORT方法视频之后,关于其中使用的卡尔曼滤波的理解 DeepSORT视频链接 首先贴几个比较好的,与本文由有关的几个帖子 图说卡尔曼滤波,一份通俗易懂的教程 卡尔曼滤波(Kalman Filter)原理与公式推导 卡尔…...

【Linux网络服务】SSH远程访问及控制

一、openssh服务器 1.1ssh协议 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能; SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令&#xff1…...

AutoGPT的出现,会让程序员失业吗?

最近,一个叫AutoGPT的模型火了,在GitHub上线数周Star数就直线飙升。截至目前,AutoGPT的Star数已经达到87k,马上接近90k,超过了PyTorch的65k。 根据AutoGPT的命名,就可以发现其神奇之处在于“auto”&#x…...

微信小程序php+vue 校园租房指南房屋租赁系统

本着诚信的原则,平台必须要掌握出租方必要的真实可信的信息,这样就可以防止欺诈事件的发生,事后也可以联系找到出租方。并且租金等各方面规范标准化,在这易租房诚信可信的平台让承租方与出租方充分有效对接,既方便了承…...

水果FL Studio21最新中文完整版下载更新及内容介绍

简单总结一下,本次小版本更新最重要的内容,我个人认为是对于M1芯片的适配。其余的比如EQ2,3x这些我们很熟悉的插件虽说也有更新,但是估计并没有特别大的改动。我个人的话会先放一段时间,等下次有其他更让我感兴趣的内容…...

springboot+vue小区物业管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的小区物业管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...

GEEer成长日记二十三:chatGPT可以帮我们提取水体边缘吗?

欢迎关注公众号:GEEer成长日记 目录 01 首先,chatGPT是什么? 02 进入正题,如何进行边缘检测? chatGPT推出之后,引发了激烈的讨论,今天带各位看看它在GEE方面能为我们做什么。原本想着它可以…...

程序员阿里三面无理由挂了,被HR一句话噎死,网友:这可是阿里啊

进入互联网大厂一般都是“过五关斩六将”,难度堪比西天取经,但当你真正面对这些大厂的面试时,有时候又会被其中的神操作弄的很是蒙圈。 近日,某位程序员发帖称,自己去阿里面试,三面都过了,却被…...

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码,循环计数器变量i的初始值为0,循环条件是i的值小于2, 也就是说当i的值为0或者1时, 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…...

SpringCloud --- Gateway服务网关

一、简介 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 二、为…...

【java】CGLIB动态代理原理

文章目录 1. 简介2. 示例3. 原理4. JDK动态代理与CGLIB动态代理区别(面试常问) 1. 简介 CGLIB的全称是:Code Generation Library。 CGLIB是一个强大的、高性能、高质量的代码生成类库,它可以在运行期扩展Java类与实现Java接口&a…...

ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

第一章、生态安全评价理论及方法介绍 一、生态安全评价简介 ​ 二、生态服务能力简介 ​ 三、生态安全格局构建研究方法简介 ​ 第二章、平台基础一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据编辑4. ArcGIS Pro空间分析5. 模型构建器6. ArcGIS Pro…...

openstack安装应答文件时报错处理

环境:centos7 在执行packstack --answer-file./answer.ini命令后,一般需要几分钟才能完成,如何在applying IP controler.pp时报错,需要注意以下几点: 0.关闭firewalld和selinux(必须) system…...

SpringBoot整合MongoDB

文章目录 一、环境准备二、集合操作三、文档操作3.1 实体类3.2 添加文档3.3 查询文档3.4 修改文档3.5 删除文档 提示&#xff1a;以下是本篇文章正文内容&#xff0c;MongoDB 系列学习将会持续更新 一、环境准备 ①添加 SpringData 依赖&#xff1a; <dependency><…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...