MySQL的跳跃式索引

news2025/1/4 18:56:09
Skip Index Scan(跳跃式索引)

例如初中有个学生表,年级、班级、学号 符合索引。

-- 问题是下面这个查询为什么也可以用到索引。
select * from 初中学生表 where 班级 = 1 and 学号 = 001

-- 思考一下这个查询比全表扫描快吗?
select * from 初中学生表 where (年级=1 and 班级 = 1 and 学号 = 001or  (年级=2 and 班级 = 1 and 学号 = 001or  (年级=3 and 班级 = 1 and 学号 = 001
Skip Index Scan的基本原理

考虑一个例子,如果表t1有索引(c1, c2),但查询的条件中只包含c2,不含c1,正常情况下,我们是无法使用这个索引的。即使使用这个索引,也必须做index的全表扫描,然后在rows上做condition操作,如select c1, c2 from t1 where c2 > 10;
但实际上,这里还是有优化的空间的,能充分利用索引的优势,尽可能的减少扫描的rows,这就是引入skip scan的原因,这个方法是由facebook贡献给mysql的,在8.0.13之后开始支持。
Skip index scan的原理很简单:通过skip 索引的前缀,对后续索引部分做小范围的range scan。

案例如下:
一张表如下

idsexage
xx1F22
xx2M21
xx3M23
xx4M31

建立了联合索引为index(sex,age)
当查询sql为 ‘SELECT * FROM X WHERE age > 30’ 时,通过skip index scan也会走联合索引进行查找,原因如下

  1. 对于联合索引来说,你想查age大于30的值,不就是当sex等于F或者M的时候age大于30的行吗
  2. 所以mysql会对查询进行优化,先通过联合索引的最左列sex的值配合B+树来在不同的sex值之间跳跃,找到每个sex中age大于30的行,比如你的sex不就时F和M吗,通过联合索引的B+树找到F的范围所在,再找age>30的数据,找完后直接跳到M所在范围找age>30的行
  3. 所以最后优化为了 ‘SELECT * FROM X WHERE (sex = ‘F’ and age > 30) or (sex = ‘M’ and age > 30)’
  4. 所谓的跳跃式索引扫描就是在对于没有最左原则匹配的情况下的查询,通过为最左列的值进行跳跃式的匹配,来达到原本的效果,从而避免以前的没有最左匹配就走全表索引
Skip Index Scan的常见应用场景

如表t5有索引c1, c2,其中distinct(c1)值很小。若在查询select c1, c2 from t5 where c2 > 30; 如下图所示:
v2-6710c7c781ec0c1358a6404f6f000adc_1440w.webp
如图所示,对于c1只有2个值,F/M,那么就可以将条件扩展为 (c1=‘F’ and c2 > 30) OR (c1=‘M’ and c2 > 30)

Skip Index Scan的限制

需要注意的是,Skip Index Scan有一些使用限制:
https://www.itworkman.com/index-skip-scan-of-mysql-8-0/

  1. select中选择的字段不能包含非索引字段。
  2. SQL语句不能包含group bydistinct语法。
  3. Skip Index Scan只支持单表查询,不能用于多表联接。

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

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

相关文章

“微软蓝屏”事件:网络安全与稳定性的深刻反思

🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 (包括spring data jpa和sqlLite连接) PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…

UE5.4内容示例(3)FBX_Import_Options - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例,可以用此熟悉一遍UE5的功能 FBX_Import_Options案例 导入案例需要和模型制作工具结合理解,这里就大致了解下都可以导入些什么内容 1.1 Stati…

基于web3区块链的名酒资产数字化、个人闲置资产收藏系统,实现联盟链、NFT数据上链、智能合约开发

系统背景: 国内有众多历史悠久却极具收藏价值的名酒品类,但是传统名酒投资存在着保真、流通和收藏三大痛点,极大影响了名酒产业的发展。基于区块链的分布式、不可篡改、可追溯、透明性、多方维护、交叉验证等特性,数据权属可以被有…

录歌用什么软件好?关于录音软件的操作介绍(内含7款)

录歌用什么软件好?借助录音软件,我们可以在电脑上录制音频文件,包括游戏原声、电台、视频会议、音乐平台等。 一、什么是录音软件 简单来说,录音软件就是一个录制声音的用户界面。这些应用程序允许用户录制任何声音、处理和混合音…

成就巴西休闲游戏如何借助Google谷歌广告投放优势

在探讨巴西休闲游戏如何借助谷歌广告投放优势实现市场扩张的过程中,我们不得不深入分析巴西市场的独特属性、休闲游戏的兴起背景,以及谷歌广告平台在全球范围内的强大影响力。近年来,随着移动游戏市场的快速发展,特别是中轻度休闲…

使用免费代理有什么危险?

一、引言 随着互联网的普及,越来越多的人开始意识到代理服务的重要性,尤其是在保护隐私和突破地域限制方面。然而,在众多的代理服务中,免费的代理服务已经成为许多人的首选。本文将深入探讨使用免费代理的危险,并帮助…

LeetCode Hot100 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3:…

【Unity渲染】烘培

光照探针 光照探针就是在烘焙的时候会布局多个探测点,记录那个地方的光照信息,后面实时渲染动态物体会影响其渲染,动态物体会选择自己周围最近的探针进行影响 反射探针 反射探针就是记录周围环境,计算一个类似天空盒的图片&am…

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?

有个小伙伴问我,GPT-4O mini是什么,当时我还一脸懵逼,便做了一波猜测: 我猜测哈,这个可能是ChatGPT4o的前提下,只支持文本功能的版本,速度更快 结果,大错特错。 让我们一起看看Open…

【QT】无法打开QT的ui文件,出现闪退情况

打开qt的ui文件出现闪退的情况: 解决办法:点击扩展-Qt VS Tools-Options 找到Qt General中的Qt Designer 的Run in detached window改为True。

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是: 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈! →点击获取网络安全资料攻略← 一、自学…

扩散模型系列0 DDPM:Denoising Diffusion Probabilistic Models

前言: 从7月12号开始 学习了一些扩散模型的论文,越看越上瘾,对未知的渴求激励着我不断地读论文整理、学习、分析、理解 以前发的博客仅仅是对论文的翻译,现在觉得仅仅翻译是不够的,读了一篇论文以后,要形成…

shardingsphere的学习(二):sharingjdbc操作读写分离

简介 mysql配置读写分离以及使用shardingjdbc配置操作读写分离 读写分离 主数据库负责增删改操作(写),从数据库负责查询操作(读),主数据库和从数据库之间会数据同步(主从复制)。 …

中电金信:云原生时代IT基础设施管理利器——基础设施即代码(IaC)

在数字化转型、零售业务快速发展、信创建设驱动下,应用架构、技术架构、基础架构都已向云原生快速演进,银行业IT基础设施管理产生了非常大的变化,当前银行业,正在开展新一轮的核心应用系统重构、基础平台统一建设等重点任务&#…

Move生态:从Aptos和Sui到Starcoin的崛起

区块链技术自诞生以来,已经经历了多个发展阶段和技术迭代。近年来,随着智能合约平台的不断演进,以Move语言为核心的生态系统逐渐崭露头角。Move语言以其安全性、灵活性和高效性吸引了大量开发者和项目方的关注。在Move生态中,Apto…

⌈ 传知代码 ⌋ 利用scrapy框架练习爬虫

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

56_Redis简单命令

一、引言 1.1 数据库压力过大 由于用户量增大,请求数量也随之增大,数据压力过大 一个请求的url 背后可能有有4-5个 sql的操作 每秒钟 qps(并发数) 1000 背后的sql操作 4000-5000mysql 单机并发量读写 8000-10000 &#x…

素数提升运算时间得算法

我们在计算素数的一种简便算法&#xff0c;用到另一个库math.h之后给大家详细的解释原理 #include<stdio.h> #include<math.h> int main() {int i 0;for (i 101; i < 200; i 2){int flag 1;int j 0;for (j 2; j < sqrt(i); j){if (i % j 0){flag 0;b…

ITSS四级认证费用是多少?

信息技术服务标准&#xff08;ITSS&#xff09;认证是评估一个企业在信息技术服务领域能力的标准之一&#xff0c;它涵盖了从基础标准、支撑标准到基于业务的需求侧和供给侧标准的全面内容。 具体条件 独立法人地位&#xff1a;申请单位需要具备独立法人地位&#xff0c;这是四…