MySQL的跳跃式索引

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://xiahunao.cn/news/3281166.html

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

相关文章

Springcloud物流配送后台-计算机毕业设计源码69809

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 物流配送后台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2 数据修改流程 2.2.3 数据…

find 命令必知必会,附常用精彩案例分享,收藏备用

find, 顾名思义“查找”的作用,作为 IT 民工,对于基本的 Linux 命令还是要有所掌握的,今天刚好用到了 find , 顺手整理一下个人常用的操作,以备忘,更全面的资料或案例大家可以自行搜索或者查阅 man find. 或者通过下面…

如何将本地代码上传到github

将本地文件上传到GitHub仓库的过程通常包括以下几个步骤: 一 创建GitHub仓库: 如果你还没有一个GitHub仓库,首先需要在GitHub上创建一个新的仓库。登录到你的GitHub账户,然后点击“New repository”按钮,填写仓库的相关…

流动的智慧:开创集成资产管理新局面 ——华为云ROMA Connect资产中心

ROMA Connect资产中心:开放生态下的轻量化集成资产管理 企业不断扩大数字化建设,使得相应的资产在数量和形态以及复杂度上呈指数型提升。如此丰富的高价值数据资源如何规范化管理、整合利用?这是很多企业反馈遇到的难题。 ROMA Connect资产…

MySQL---JDBC

一、JDBC是什么? JDBC(Java Database Connectivity):是Java访问数据库的解决方案。 JDBC定义了一套标准的接口,即访问数据库的通用API,不同数据库的厂商根据各自数据库的特点实现这些接口。 JDBC希望用相同的方式访问不同的数据库&#xff0c…

苹果发布iPhone AI,Apple Intelligence初版落地!未融入ChatGPT,仅面向付费开发者

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 苹果公司Apple Intelligence初版落地:iPhone AI引领智能化新篇章 在全球科技领域,苹果公司一直以其创新精神和前沿技术…

Potree点云可视化卡片开发指南

本文由ScriptEcho平台提供技术支持 项目地址:传送门 Potree点云可视化卡片开发指南 应用场景介绍 Potree点云可视化卡片是一款基于Potree库开发的Vue组件,它允许用户在Web应用程序中轻松嵌入和交互式可视化大规模点云数据。该卡片特别适用于需要在We…

Redis 内存淘汰策略

Redis 作为一个内存数据库,必须在内存使用达到配置的上限时采取策略来处理新数据的写入需求。Redis 提供了多种内存淘汰策略(Eviction Policies),以决定在内存达到上限时应该移除哪些数据。

LLM的训练与推断

LLM的训练与推断 目前比较流行的大模型一般都是自回归模型。在推理时,它类似于RNN,每次计算下一个token的概率。也就是说,如果除去最开始的输入情况下,最终推理长度为n的话,就需要计算n次。但是训练却是并行化的。 在…

在国产芯片上实现YOLOv5/v8图像AI识别-【2.2】RK3588上C++开发环境准备及测试更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 板子…

Idea包含UI内容的插件开发

Idea包含UI内容的插件开发 前言插件效果项目结构配置功能的实现找一个股票接口完成最终的页面配置Plugin.xml源码地址 前言 在这一篇文章中将会做一个包含UI内容的能看股票的插件。 插件效果 首先是在设置中配置股票的编号,如sh000001,sh600519。 接着在侧边栏中…

为何2024年这4款ai智能写作工具被赞为YYDS?

在数字化的大潮中,人工智能已经深入到我们生活的各个角落,当然也包括写作领域。随着ai智能写作工具的兴起,它们不仅显著提升了写作效率,还为创作打开了全新的可能性。今天,我们就来看看四款特别受欢迎的AI写作工具&…

干货分享 | 基于VB6.0 实现 CAN信号收发 Demo

本文主要讲的是,基于TSMaster 实现 TOSUN 系列 CAN/CANFD,LIN 设备的操作。主要给大家介绍在 TSMaster 软件里如何实现 CAN 信号收发 Demo工程。 本文关键词:CAN报文、VB6.0、libTSCAN 一、关于Demo工程 简要描述: VB6.0编程语…

Python药物副作用生物图分析算法和矩阵降维算法

🎯要点 🎯人体疾病模块网络结构位置与病理生物学关系 | 🎯药物与药物靶点相互作用 | 🎯细胞和蛋白质之间的作用分层 | 🎯疾病和症状之间的联系 | 🎯药物与副作用之间的联系 | 🎯生物学分析 &a…

年过30年程序员,到底要不要考虑搞点副业

一、前言 作为一名年过三十的程序员,我深刻体会到了职场的残酷和不确定性。在这个技术日新月异的时代,我们不仅要在专业领域深耕细作,更要敏锐地捕捉互联网的风口,以确保自己不被时代淘汰。程序员的黄金年龄似乎被限定在35岁之前…

事务性邮件api接口服务怎么选?怎么集成?

事务性邮件API接口安全性如何保障?API接口调用方法? 在现代企业的运营中,事务性邮件是确保信息及时传达和用户体验的关键环节。AokSend将探讨如何选择合适的事务性邮件API接口服务,以及如何有效地集成这些服务。 事务性邮件api接…

MongoDB下载与基本使用(mac图文详解)

目录 一、下载安装 1.1 官网下载mongoDB 1.1.1 mongoDB 1.1.2 MongoDB GUI 1.2 下载流程 二、基本使用 2.1 创建数据库和集合 2.2 插入 2.3 查询 2.4 修改 2.5 删除 三、case 3.1 销售case 3.1.1 实操 3.1.2 全部指令汇总 背景: 个人练习用 一、下…

《计算机网络》(第8版)第九章 无线网络和移动网络 复习笔记

第九章 无线网络和移动网络 一、无线局域网 WLAN 1 无线局域网的组成 无线局域网提供移动接入的功能,可分为两大类:有固定基础设施的和无固定基础设 施的。 (1)IEEE 802.11 IEEE 802.11 是无线以太网的标准,是有固定…

MySQL安装教程(保姆级)

1. 首先要了解自己的计算机 打开设置——系统——系统信息 然后就可以知道自己计算机的类型了。 2. 下载MySQL 2.1. 来到MySQL官网 点击进入 我们下拉页面,可以找到DOWNLOADS 页面默认给咱们选择最新的版本,咱们不用,咱们尽量选一个稳定的版…

Linux的防火墙

一、防火墙概述 防火墙是一种计算机硬件和软件的结合,使internet和intranet之间建立一个安全网关(Security Gateway),从而保护内网免受非法用户侵入的技术。 防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。…