MYSQL - 索引详解
一 什么是索引?
实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点,在引擎层,我们提到不同的引擎对应的索引的实现方式,选择是不一样的。
简单理解,索引(index)其实就是一种帮助MYSQL高效的获取数据的数据结构(有序排列),说到数据结构就会想到B树,红黑树,hash表等......那么作为一种数据结构,就需要进行维护,保存。例如对u有MyISAM引擎来说,其索引相关的信息都会保存在 xxx.MYI当中进行保存与维护。而在InnoDB存储引擎当中,对应的表结构,数据以及索引都存储在了xxx.ibd当中
二 索引的优缺点
优点:
1. 索引的添加可以让我们通过这种数据结构快速的定位对应添加所以的数据,加快查询效率,并且降低数据库的IO次数。
2. 通过索引将表当中的数据先进行排序,那么就会加快之后数据排序的效率,降低排序成本,降低CPU资源的消耗
缺点:
1. 前面我们提到,索引实际上是一种数据结构,那么索引列也是需要占用磁盘的一些空间的。消耗了额外空间(但实际上磁盘比较便宜,其所占用的空间也比较少,可以忽略不计)
2. 索引提高了数据查询的效率,但是反过来,降低了对应数据的更新以及新增的效率。
这是因为索引也是一种数据结构,我们在修改对应数据的同时,对应的索引的数据也需要进行修改,由此造成的数据的新增和插入速度的降低(对于一些业务来说,实际上增删改占用的比例远远少于查询)
三 索引结构
MYSQL的索引是在对应的存储引擎层实现的,不同的存储引擎对应的有不同的索引结构,索引结构主要包含以下几种:
B+Tree索引:最常见的索引类型,大部分的索引引擎都支持
Hash索引:底层通过HASH表实现,因此决定了其只能够进行精确匹配,无法进行范围查询
R-tree(空间索引): 空间索引为MyISAM所特有的一种特殊的索引类型,主要用于地理空间数据类型
Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式,类似于Lucene,ES等
倒排索引拓展:
倒排索引实际上也是一种数据结构,广泛用于信息检索系统,例如搜索引擎。其基本思想是将文档中的 单词 与 包含这些单词的文档列表 进行映射,从而快速查找包含特定单词的文档。
倒排索引组成部分:
词项(Term):文档中出现的唯一单词。
文档列表(Document List):包含该词项的所有文档的标识符。
工作原理:
索引构建:
在文档集合中提取所有的词项。
为每个词项创建一个列表,记录哪些文档包含该词项。
查询处理:
当用户搜索某个词时,系统可以快速查找该词项对应的文档列表,而不需要逐个扫描所有文档。
四:B+Tree 索引结构
首先让我们从简单的二叉树开始进行分析,通过其优缺点,观察,总结为什么大部分的存储引擎都选择这个作为索引结构
1. 二叉树(特指BST)
首先是二叉树,但是实际上我们这里指的是搜索二叉树(Binary Search Tree,BST),其主要特点是每个节点最多只能有两个子节点,每个节点的值都大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种结构使得搜索、插入和删除操作都能在平均情况下以较高的效率进行。
在常规情况下,所有的数据均匀分布且并不是太多的情况下,二叉树可以大大提高数据的查询效率。
但是这种数据结构存在很大的弊端:
1. 如果数据分布并不均匀,流入根节点为50,之后输入的几个节点全部都比50小,那么就会导致对应的数据全部都在左边,从而形成了一条链,那么我们要查询的节点的数据的效率可能就从原本的O(ln n)变为了O(n)的时间复杂度 。
2. 如果对应的数据量比较多的情况下,因为每一个父节点下只能最多存储两个子节点信息,那么数据一旦变多,就会导致对应的层数加深,使得查询效率降低。
解决办法:使用一种可以自动调节高度的树以解决问题1这种情况 == 》 红黑树
2. 红黑树
红黑树是搜索二叉树的升级版本,其会自动调节对应节点之间的高度,使得各个节点之间的高度之差的绝对值不大于1,从而避免那种类似‘链状’的存储情况发生。
但是同样的,红黑树也会避免不了我们在搜索二叉树所指出的问题二,也就是避免不了因为存储的数据的数据量的激增而导致对应层数加深 - > 从而导致查询效率大大下降。
那么有没有一种数据结构能解决这种层级过深所导致的问题呢?
解决方法:使用B-tree 树结构
3.B-tree(多路平衡查找树)
从名字我们就可以知道,多路指的是其字节点的个数不再只能是2,而是由我们进行人为的指定,这样就会在一定程度上减少对应数据大量存储的时候所导致的层数过深的情况的产生。
因此在B-Tree当中,我们需要指定对应的最大度数(max-degree),也就是对应一个节点的子节点个数。例如指定为5(5阶)的b-tree树,那么每一个节点最多可以存储4个KEY,以及5个指针信息。其一个节点下各个KEY的排列顺序也是从小到达进行排列。
这里的5个指针分别指向的是5个范围之内的数据,以下图为例
应当是: 小于20的数
大于20小于30的数
大于30小于40的数
大于40小于50的数
大于50的数
如上图当前节点已经存在了4个KEY,那么之后再进行存储就会将中间的数向上提取,之后将中间左边以及右边的数向两边搁置,我再添加一个KEY = 35
那么加入之后当前节点的KEY当中,35是中间的数据,向上提。如图所示:
而且还要注意的一点是,在B-Tree数当中,其所有节点既存放键(key) 也存放数据(data)
4.B+Tree
B+ 树是 B 树的一种变体。B 树和 B+树中的 B 是 Balanced
(平衡)的意思。
相比较于B-Tree,B+Tree与其有以下几点不同:
1>B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
2>B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
B+树当中所有的元素都会出现在叶子节点当中,并且叶子节点之间的关系是一种链状排列,形成单向链表。
节点不再存放对应的KEY的值,而是仅仅只存放一个KEY,数据均放置在叶子节点当中,这样的设置就表明对应KEY其实就是一个索引,指向对应数据所在位置。
五 hash索引
hash索引实际上背后是依据hash表构建的,存放方式是键值对的方式,其会将对应的KEY的值 ==> 通过一些效率比较高的哈希算法得到新的hash值 ==> 映射到对应的内存槽位上,然后将对应的数据存放在这个槽位上。
但是多个数据的哈希值是可能重复的,也就是说通过KEY计算出来的hash值一样,这就叫做哈希冲突,发生哈希冲突时,哈希表使用链表的解决方式,也就是说即使当前的槽位上已经存在数据了,那么我也可以存放,我会将这个新的数据的值存放在此链表的末尾。但是这样也存在一定问题,聪明的你能想想为什么吗?告诉我吧 ^ - ^
如图:
这样就可以高效的通过KEY直接获取到对应的数据信息了
但是哈希表的这种查找,存储数据的方式注定了其无法进行多条数据的查找,只能够做到一对一精确查找。否则就会降低查找效率。
六 思考题 - 为什么InnoDB选择B+Tree作为默认的索引结构?
通过以上对于各个索引结构的分析,我们不难分析出为什么
1. 相比较于BTS以及红黑树,B+树既能够避免链状结构的产生,从而导致查询效率的降低;也能够通过自定义最大度数来放置因为数据过多导致树的层级过深造成的查询速度变慢。因此,两者都OUT。
2.相比较于B-Tree树来说,使用B+树仅仅只在叶子节点存放对应的KEY的数据,而B树在所有的子节点都存放有对应的VALUE,我们还知道索引这种数据结构是在存储引擎当中实现的,那么其存储则会跟随存储引擎存放在本地磁盘,而索引的存放空间是有限的,一个节点信息会存放在 ’一页‘ 上,‘一页’存储数据的大小为16K。而B树每一个子节点都会保存数据,就会导致一页种存储的键值减少,指针跟着减少,想要同样保存大量的数据,只能够增加树的高度,从而导致性能的下降,因此OUT。
3. 相比于HASH,HASH虽然查询效率高,但是只能够进行精准匹配,无法进行范围性的查找,获取数据,因此OUT。
之后也会更新MYSQL相关内容,关注不迷路,兄弟们 ^ - ^
相关文章:
MYSQL - 索引详解
一 什么是索引? 实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点,在引擎层,我们提到不同的引擎对应的索引的实现方式,选择是不一样的。 简单理解,索引(index)其实就是一种帮助MYSQL高…...
AI智能体Prompt预设词指令大全+GPTs应用使用
AI智能体使用指南 直接复制在AI工具助手中使用(提问前) 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档:Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用: 文章润色器 你是一位具有敏锐洞察…...
美团一面,有点难度
前几天分享过一篇训练营的朋友在阿里的一面面经,挺简单的她也是很轻松的过了,感兴趣的可以看一下我之前发的文章。 今天要分享的还是她的面经,美团的一面,感觉比阿里的难一些,各位观众老爷你怎么看? 自我介…...
axios取消请求
Axios 使用 cancel token 取消请求 1、先在axios请求中加上cancelToken import request from ../utils/request // 配置过的Axios 对象 import axios from axios export function getDetail(params, that) { return request({url: /api/indexlineage/detail, method: get,par…...
Spark简介
Spark简介 菜鸟弹性分布式数据集 (RDDs)参考 Spark通过两种方式使用Hadoop:一种是存储,另一种是处理。由于Spark具有自己的集群管理计算,因此仅将Hadoop用于存储目的。 Spark 的关键思想是- [Resilient Distributed Datasets(RDD…...
visual studio2017版本的安装下载
绝绝子,官网找了半天都不知道在哪里下载的,和当初下载旧版本的qt一样难受,还是用百度云吧!!!!!!!!!! 参考文章࿱…...
【Linux】ubuntu下一键配置vim
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:Linux权限(超详细彻底搞懂Linux的权限) 🔖流水不争,争的是滔滔…...
[光源控制] UI调节光源亮度参数失效
📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览: 一. 前言二. 串口调试助手辅助排查接线问题二. …...
C语言学习:速通指针(2)
这里要学习的有以下内容 1. const修饰指针 2. 野指针 3. assert断⾔ 4. 指针的使⽤和传址调⽤ 那么从这里开始 1. const 修饰指针 const修饰变量 首先我们知道变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变…...
方案拆解 | 打击矩阵新规频出!2025矩阵营销该怎么玩?
社媒平台的矩阵营销又要“变天”了?! 11月18日,小红书官方发表了被安全薯 称为“小红书史上最严打击黑灰产专项”新规,其中就包括黑灰产矩阵号的公告。 ▲ 图源:小红书 实际上,不包括这次,今年…...
Ubuntu22.04深度学习环境安装【cuda+cudnn】
为了复现一篇深度学习论文,特意安装了Linux系统。前一天已经安装Linux显卡驱动,现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本: 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0,python没…...
etcd分布式存储系统快速入门指南
在分布式系统的复杂世界中,确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中,我们将深入研究etcd,这是一个开源的分布式键值存储。我们将探索其基本概念、特…...
dataTable
在 C# 中,DataTable 是 .NET Framework 中用于处理数据表格的一个类,属于 System.Data 命名空间。它是一种内存中表示数据表的结构,通常用于临时存储和操作数据,类似于数据库中的表。DataTable 的主要特点是行列结构,其…...
Flink学习连载文章11--双流Join
双流 Join 和两个流合并是不一样的 两个流合并:两个流变为 1 个流 union connect 双流 join: 两个流 join,其实这两个流还是原来的,只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…...
RayLink远程控制技术助力教育领域的创新应用研究
远程控制技术在教育领域的应用确实改变了传统教学模式。想象一下,无论身处何地,只要有网络连接,就能通过远程软件加入课堂,这种体验是不是很吸引人?虽然远程控制听起来很技术化,但别担心,小编今…...
【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器(非直接运行图形库)
【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器(非直接运行图形库) 打包开源地址: Qt函数库gitee地址 更新以gitee为准 移植后的demo工程: gitee 有些没实现的 后续我会继续优化 文章目录 别碰瓷看清楚:是移植&#…...
PostgreSQL UNION 操作符
PostgreSQL UNION 操作符 引言 PostgreSQL 是一种功能强大的开源对象关系型数据库管理系统,它以其稳定性、可靠性和先进的特性而闻名。在处理数据库查询时,我们经常需要合并来自不同表的数据,或者合并同一表的不同查询结果。这时,UNION 操作符就变得非常有用。本文将详细…...
spring boot 测试 mybatis mapper类
spring boot 测试 mybatis mapper类 针对 mybatis plus不启动 webserver指定加载 xml 【过滤 “classpath*:/mapper/**/*.xml” 下的xml】, mapper xml文件名和mapper java文件名称要一样,是根据文件名称过滤的。默认情况加载和解析所有mapper.xml 自定义 MapperT…...
Python发kafka消息
要在Python中向Kafka发送消息,你可以使用kafka-python库。首先,你需要安装这个库。如果你还没有安装它,可以通过pip来安装: bash pip install kafka-python 接下来是一个简单的例子,展示如何创建一个生产者࿰…...
zipkin 引申一:如何遍历jar目录下的exec.jar并选择对应序号的jar启动
文章目录 一、Zipin概述二、如何下载三、需求描述四、代码实现1. pom设置2. 相关工具类3. 核心代码 五、打包部署1. 打包,在项目目录执行mvn clean package2. 部署3. 运行以及停止 六、源码放送 一、Zipin概述 Zipkin是Twitter开源的分布式跟踪系统,基于…...
使用 httputils + protostuff 实现高性能 rpc
1、先讲讲 protobuf protobuf 一直是高性能序列化的代表之一(google 出品)。但是用起来,可难受了,你得先申明 “.proto” 配置文件,并且要把这个配置文件编译转成类。所以必然要学习新语法、新工具。 可能真的太难受…...
Facebook广告文案流量秘诀
Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密! 一、广告文案怎么写? 正文:这是帖子的正文,出现在您姓名的正下方。它可…...
在Vue.js中生成二维码(将指定的url+参数 生成二维码)
在Vue.js中生成二维码,你可以使用JavaScript库如qrcode或qr.js。以下是一个简单的例子,展示如何在Vue组件中使用qrcode库将指定的URL加上参数生成二维码。 首先,你需要安装qrcode库。如果你使用的是npm或yarn,可以通过命令行安装…...
Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!
今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR,可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像(第一行)和二维码图像(第二行)。生成的二维码不仅忠实地保留…...
【Linux网络编程】第六弹---构建TCP服务器:从基础到线程池版本的实现与测试详解
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、TcpServerMain.cc 2、TcpServer.hpp 2.1、TcpServer类基本结构 2.2、构造析构函数 2.3、InitServer(…...
XML 语言随笔
XML的含义 XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。XML与HTML(HyperText Markup Language,超文本标记语言)类似,但XML的设计目的是描述数据&…...
flex: 1 display:flex 导致的宽度失效问题
flex: 1 & display:flex 导致的宽度失效问题 问题复现 有这样的一个业务场景,详情项每行三项分别占33%宽度,每项有label字数不固定所以宽度不固定,还有content 占满标签剩余宽度,文字过多显示省略号, 鼠标划入展示…...
65页PDF | 企业IT信息化战略规划(限免下载)
一、前言 这份报告是企业IT信息化战略规划,报告详细阐述了企业在面对新兴技术成熟和行业竞争加剧的背景下,如何通过三个阶段的IT战略规划(IT 1.0基础建设、IT 2.0运营效率、IT 3.0持续发展),系统地构建IT管理架构、应…...
15.三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&am…...
【Notepad++】---设置背景为护眼色(豆沙绿)最新最详细
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Notepad】---设置背景为护眼色…...
项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面
一、User 1、使用数据注解设置主键和外键 设置主键:在User类的U_uid属性上使用[Key]注解。 设置外键:在Order类中,创建一个表示外键的属性(例如UserU_uid),并使用[ForeignKey]注解指定它引用User类的哪个…...
电子商务人工智能指南 3/6 - 聊天机器人和客户服务
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...
vue.js组件开发的所有流程
1. 设计组件架构 首先,你需要考虑应用的结构,决定哪些部分应该成为独立的组件。这包括: 提取重复的UI元素:如按钮、输入框、卡片等。 功能模块:例如登录框、导航栏、数据表格等。 2. 设置开发环境 安装Node.js…...
从零开始学TiDB(1) 核心组件架构概述
首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译:首先一条SQL语句最先到达的地方是TiDB Server集群,TiDB Server是无状态的,不存储数据,SQL 发过来之后TiDB Server 负责 解析,优化,编译 这…...
VsCode运行Ts文件
1. 生成package.json文件 npm init 2. 生成tsconfig.json文件 tsc --init 3. Vscode运行ts文件 在ts文件点击右键执行Run Code,执行ts文件...
初始化webpack应用示例
1、初始化npm mkdir webpack_test cd webpack_test npm init 2、安装webpack依赖 npm install webpack webpack-cli -D 3、添加文件夹,入口文件 mkdir src touch index.js touch add-content.js 文件夹结构 index.js import addContent from "./add-cont…...
liunx docker 部署 nacos seata sentinel
部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL_SERVICE_PORT3306 -e MYSQL…...
MySQL面试
文章目录 事务隔离级别需要解决的问题事务隔离级别 MySQL 中是如何实现事务隔离的实现可重复读 什么是存储引擎如何定位慢查询分析慢查询原因MySQL超大分页怎么处理索引失效什么时候建立唯一索引、前缀索引、联合索引?redolog与binlog是如何保证一致的redolog刷盘时…...
linux运维之shell编程
Shell 编程在系统运维中及其重要 1. Shell 编程概述 Shell 是一种命令行解释器,能够执行操作系统的命令。Shell 脚本是一个包含一系列 Shell 命令的文件,它可以被执行,以自动化和批量处理任务。常用的 Shell 类型包括 bash、sh、zsh 等。Shel…...
ssm 多数据源 注解版本
application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…...
Nginx核心配置详解
一、配置文件说明 nginx官方帮助文档:nginx documentation nginx的配置文件的组成部分: 主配置文件:nginx.conf子配置文件: include conf.d/*.conffastcgi, uwsgi,scgi 等协议相关的配置文件mime.types:…...
十六(AJAX3)、XMLHttpRequest、Promise、简易axios封装、案例天气预报、lodash-debounce防抖
1. XMLHttpRequest 1.1 XMLHttpRequest-基本使用 /* 定义:XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更…...
12.06 深度学习-预训练
# 使用更深的神经网络 经典神经网络 import torch import cv2 from torchvision.models import resnet18,ResNet18_Weights from torch import optim,nn from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 from torchvision import tr…...
【计算机网络】期末速成(2)
部分内容来源于网络,侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信,靠**套接字Socket(主机IP地址,端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…...
Python学习笔记10-作用域
作用域 定义:Python程序程序可以直接访问命名空间的正文区域 作用:决定了哪一部分区域可以访问哪个特定的名称 分类: 局部作用域(Local)闭包函数外的函数中(Enclosing)全局作用域࿰…...
Sui 主网升级至 V1.38.3
Sui 主网现已升级至 V1.38.3 版本,同时协议升级至 69 版本。请开发者及时关注并调整! 其他升级要点如下所示: 协议 #20199 在共识快速路径投票中设置允许的轮次数量。 节点(验证节点与全节点) #20238 为验证节点…...
linux的vdagent框架设计
1、vdagent Linux 的 spice 客户代理由两部分组成,一个系统范围的守护进程 spice-vdagentd 和一个 X11 会话代理 spice-vdagent,每个 X11 会话有一个。spice-vdagentd 通过 Sys-V initscript 或 systemd 单元启动。 如下图:spice-vdagent&a…...
vue3+elementPlus封装的一体表格
目录结构 源码 exportOptions.js export default reactive([{label: 导出本页,key: 1,},{label: 导出全部,key: 2,}, ])index.vue <template><div class"flex flex-justify-between flex-items-end"><div><el-button-group><slot name…...
判断是否 AGP7+ 的方法
如何判断? /*** 是否是AGP7.0.0及以上* param project* return*/static boolean isAGP7_0_0(Project project) {def androidComponents project.extensions.findByName("androidComponents")if (androidComponents && androidComponents.hasProp…...
使用 Streamlit +gpt-4o实现有界面的图片内容分析
在上一篇利用gpt-4o分析图像的基础上,进一步将基于 Python 的 Streamlit 库,结合 OpenAI 的 API,构建一个简洁易用的有界面图片内容分析应用。通过该应用,用户可以轻松浏览本地图片,并获取图片的详细描述。 调用gpt-4o…...