原理这就是索引下推呀

news2024/11/24 16:39:53

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

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

介绍索引下推之前先看一下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,提高了查询性能。

总结

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

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

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

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

相关文章

2022年NOC大赛创客智慧编程赛道图形化scratch复赛题,包含答案解析

目录 2022 年 NOC 大赛创客智慧编程图形化复赛用题 下载文档打印做题:

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

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

命令执行的判断根据:;、、

文章目录 命令执行的判断根据:;、&&、||cmd ; cmd(不考虑命令相关性的连续命令执行)$?(命令返回值)与&&或||使用案例例题 命令执行的判断根据:;、&&、|| 在某些情况下,我想要一次执行很多命令,而不想分…

【jvm系列-10】深入理解jvm垃圾回收器的种类以及内部的执行原理

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

JavaScript字符串操作

ASCII(as key) 字符集(了解) 我们都知道,计算机只能存储 0101010 这样的二进制数字,那么我们的 a ~ z / A ~ Z / $ / /… 之类的内容也有由二进制数字组成的 我们可以简单的理解为, a ~ z / …

浅谈文心一言

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

[oeasy]python0140_导入_import_from_as_namespace_

导入import 回忆上次内容 上次学习了 tryexcept 注意要点 半角冒号缩进输出错误信息 有错就报告 不要隐瞒否则找不到出错位置还可以用traceback把 系统报错信息原样输出 但是代码量好多啊 10多 行了 🤯可以把他输入部分和输出部分么?🤔 我…

【计算机组成原理】第四章 指令系统

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录前言第四章 指令系统4.1 指令系统的发展与性能要求4.1.1 指令系统的发展4…

CTR-GCN 代码理解

论文代码:https://github.com/Uason-Chen/CTR-GCN ctrgcn.py 文件路径:CTR-GCN/model/ctrgcn.py import math import pdbimport numpy as np import torch import torch.nn as nn from torch.autograd import Variabledef import_class(name):compone…

动态设置图片的主题色(保留明暗关系)

github地址 PrimaryColorDemo 效果 原始图片 就是一张普通的png图片 根据选择的主题色动态渲染。 思考 最近在思考怎么实现动态的设置图片的主题色。不是那种渲染透明iocn。而是把图片的明暗关系保留。而改变其中的主题色。终于花了半天的时间研究出来了。和大家共享。 …

AI对话AI才是正解?KAUST研究团队提出基于角色扮演的大模型交互代理框架CAMEL

电影《盗梦空间》中有这样一句非常经典的台词: “世上最具有可塑性的寄生虫是什么?是人类的想法。人类大脑中一个简单的想法,就可以建立一座庞大的城市。有时一个想法也可以改变世界,并改写一切规则,这就是我为什么要…

0703齐次方程-微分方程

文章目录 1 定义和解法1.1 定义1.2 微分方程中的变量替换1.3 齐次方程的解法 2 例题结语 1 定义和解法 1.1 定义 形式上可化为 d y d x g ( y x ) \frac{dy}{dx}g(\frac{y}{x}) dxdy​g(xy​)的方程,称为齐次方程。 例如 d y d x y x tan ⁡ y x , d y d x e y…

操作系统考试复习—第二章 2.1 2.2程序和进程的描述

第二章 进程的描述与控制 程序:有序的指令集合 程序顺序执行的特征:1.顺序性 2.封闭性 3.可再现性(确定性) 在多道程序环境下,允许多个程序并发执行,此时他们将失去封闭性,并具有间断性和不可再现性的特征。为此引…

net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content) 报错

一、问题描述 最近现场实施人员反馈有个功能不能正常使用,F12查看浏览器的控制台,提示net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content)的错误, HTTP状态码206表示“部分内容”(Partial Content),…

全网最细,Jmeter性能测试-分布式压力测试环境搭建(超详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 JMeter设计之初是…

【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手

目录 类型 String 字符串 List 列表 Set 集合 Sorted Set /ZSet 有序集合 Hash 哈希表 GEO 地理空间 HyperLogLog 基数统计 Bitmap 位图 BitField 位域 Stream 流 线上测试地址 常用命令 key 操作指令 String 操作指令 List 操作指令 Set 操作指令 ZSet 操作…

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 目录 STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期1、介绍2、STM32CubeMX配置2.1 基本配置2.2 PWM输出配置2.3 PWM输入捕获配置 3、程序修改和测试 本篇博客以STM32F103C8为例,其他…

selenium_交互 (谷歌浏览器驱动下载 xpath插件安装)

安装selenium (1)查看谷歌浏览器版本 谷歌浏览器右上角 ‐‐> 帮助 ‐‐> 关于 查看 浏览器版本: (2)操作谷歌浏览器驱动下载地址 http : // chromedriver . storage . googleapis . com / index . html 找到…

FPGA、 CPU、GPU、ASIC区别

一、为什么使用 FPGA? 众所周知,通用处理器(CPU)的摩尔定律已入暮年,而机器学习和 Web 服务的规模却在指数级增长。 人们使用定制硬件来加速常见的计算任务,然而日新月异的行业又要求这些定制的硬件可被重新…

2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解

写在前面 以下代码,目前均可通过民间OJ数据(dotcpp & New Online Judge), 两个OJ题目互补,能构成全集,可以到对应链接下搜题提交(感谢OJ对题目的支持) 如果发现任何问题&…