MySQL的索引使用的数据结构,事务知识
一、索引的数据结构🌸
索引的数据结构(非常重要)
mysql的索引的数据结构,并非定式!!!取决于MySQL使用哪个存储引擎
数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存里面,内存里面的数据结构,对于访问操作不敏感,(找数据的过程花费的时间多,但是真正用于访问的数据不多,硬盘上的数据操作,对于访问操作比较敏感,但是⚠️读写一个的硬盘
开销是远大于内存的,读写一次硬盘,差不多可以多些一万次内存了。
数据结构简单回顾,引入innodb💘💘💘
MySQL包含很多模块,
有的解析SQL,有的用于网络通信,有的存储数据结构->如:存储引擎,本质上就是代码中的一个模块(这里包含若干个代码文件····以及一大堆具体的代码)
✨✨✨最主流的存储引擎:innodb
索引用的数据结构我们也只介绍innodb
我们要先知道索引是为了查找!!!(查找快的才牛波一)
让我们简单的回顾一下数据结构的知识吧 (🌝 🌚 🌑正好学的次)
顺序表:尾插,随机访问很屌
链表:中间位置的插入删除很屌
栈和队列:特定位置的增删查改
二叉树->二叉搜索树->平衡机制的二叉树(红黑树)或许可以查找速度还是很屌的
堆:适合排序,找最大最小
哈希表:查找嘎嘎🐮牛波一(以后工作常用)
👲 👳 👷
那来看看哪个更适合呢
红黑树:插入,删除,修改,查询,-元素有序,可以处理范围查询
最大问题,红黑树会在元素比较多的时候变的很高->对应比较次数就会变得很多,每次比较都意味着硬盘IO操作!!!(很耗硬盘开销)
单单这几个数,他就已经树高变成这样了
哈希表:哈希表的问题是只可以精准查询,不能支持模糊查询,范围查询(哈希表需要通过给定的key,通过hash函数映射出一个具体下标,才能定位到具体位置)。
二、B树💓💓💓
那么索引(innodb引擎)到是用的什么数据结构呢?
为了数据库,大佬们专门搞了个数据结构叫B+树(其他存储引擎中可能用到hash(哈希表)作为索引->只能应对这种精准匹配自己的情况了
那么什么是B+树呢,那我们需要了解B树也叫(B-树。叫B杠树 不要当土狗😨)
B树的本质是一个N叉搜索树,一个节点可以保存多个key,N个key就可以延伸出n+1个分叉来,N个key划分出了N+1个空间,(4个数5个空间)如下图
注意:一个节点多个key和一个key 都差不多的硬盘开销
此时每个节点上,都可以保存多个元素,当总的元素个数固定时,相较于二叉搜索树,涉及到的节点总数大大降低,树高也大大降低了,B树和B+树高度远远小于红黑树,于是这么查询,硬盘的IO次数也就随之减少了。
对于B树插入和删除元素,就涉及拆封和合并的操作(比如,拆分是确认区间,合并是给他聚到一起)当然了一个节点也不可以无脑存key(就是数),要不然存的太多就要变成数组了,所以要把这个节点一部分key以树节点的方式重新组织。
如1,2,3,4,此时再加入个5,就有点多了,所以说此时就会把 1,2,3,4,5
拆分成如下图,保持当前节点的key始终不会太多,此时就会生出新的叶节点
B树不如B+树的一个点:B+树全集有叶子和非叶子,如果写元素存到每一个节点上,非叶节点占据空间比较大,从而无法从内存中缓存了。
补充一个小知识点(HashMap负载因子是多少 ‘0.75’,链表长度多少时候转化为红黑树 ‘8’ 但是首先HashMap不是哈希表,只是哈希表的一种表达方式,但是最好不要记参数,最好要根据实际情况。
三、B+树💚 💚 💚
B+树在B树的情况下,又做出了一些改进->针对数据库的场景展开的
1.B+也是二叉搜索树,但是N个key分出了N个区间,其中最后一个就是相当于最大值
2.父节点的key在子节点重复出现(而且是以最大值的身份)
看起来会有很多的元素,浪费空间,但实际上可以起到非常重要的作用(上面存在的,下面都有,叶子节点这一层,包含了整个数据的全集!)
3.把叶子节点,按照链表方式首尾相连,此时可以通过叶子节点之间的连接,快速找到上一个/下一个的元素)
四、B+树的优点产生的优势💞
1.特别擅长范围查询
2.所有的查询操作最终都会落在叶子节点,比较次数,是均衡的,查询时间是稳定的,还是那句话‘有时候稳定比快更好’,时快时慢,用户的体验会不好,慢点但是稳定才好。
3.在B+树中,叶子节点上是完整的数据全集(注意哈,1不是只代表1,而是代表ID为1的连接。如同 1 -张三-90分),因此表中的每一个数据的其他列都可以得到在叶子节点上,只存储构建索引的id就行(就相当于一个网址链接)
物理层面:不需要表格这样的数据结构,直接使用B+树来存储这个表的数据,‘表格’只是用户看起来这个像是个表格而已,此时,非叶子节点的存储空间消耗是非常小的!!!(叶子存在硬盘,非叶子可以存在内存中),此时,进行数据查询的时候,就可以通过内存来直接比较,从而更快速的找到叶子节点上的记录(进一步又减少了硬盘IO的次数)
五、事务的基本情况💖
什么叫事务呢?
假如说表balance(accountId,balance)
1 , 1000
2 , 1000
1号给2号转账500,分为两步,第一步给1账户扣500,给2账户+500,中间还不能有差错,不然用户脑袋气死了😡
执行的时候,肯定是不知道哪一步会失败,❗️❗️然后事务的本质是把多个操作,打包成一个操作完成的,让这个操作,要不我就全部完成,要不我就完全失败那种——原子性😃😃
⚠️⚠️完全失败不是说一个没做,而是说假如第一步做了,但是第二步失败了,他的选择是把第一步给还原回去。(这个还原我们也管他叫回滚)
如何实现回滚呢:只要把事务中执行的每个操作都记录下来(通过特定的日志,来记录数据库事务操作的中间过程),如果需要回滚,按照之前的操作的“逆操作”就可以了。
如:1号-500,2号+500
若执行第一步的过程中,如果程序崩溃了~此时,就要对第一步进行回滚~~
数据库会自动把第一步操作的修改还原回去,那么假如数据库挂了呢🌚重启了捏🌚
我们是通过日志,来记录事务执行的中间过程的,日志中的数据始终在硬盘上存在的。即便是数据库服务器重启~就会在启动之后,针对之前没回滚完成的情况,继续处理~
要么是全部成功,要么是一个都不执行。
事务->原子性->回顾->特定日志
六、事务的使用方式💘
开启事务:start transaction (下面就可以输入多个sql语句了 )
提交事务:commit。 (把这些SQL按照原子的方式进行执行)
手动出发回滚:rollback 手动触发回滚~~
一个事务务必以后两条操作结尾(当然了解命令即可,不会用这个命令,我们一般是使用代码去操作事务)
七、事务的基本特性(面试题,理解的去思考去记)💜 💜 💜
1.原子性:保证多个操作被打包成一个整体,要不全成,要不一个也不做。
2.一致性:事务执行之前,和事务执行之后,数据能对上,数据不能够太牛马离谱
3.持久性;事务这里的各种操作,都是持久生效最终写到硬盘上,即使关机,也不影响的
4.隔离性:并发执行事务时候,隔离性,会在执行效率和数据可靠之间做出权衡,隔离描述的是在同时执行的事务之间,相互的影响,隔离性越高,并发性越低,数据越可靠,性能也就越低。(下一篇会介绍并发的,家人们别急)
相关文章:

MySQL的索引使用的数据结构,事务知识
一、索引的数据结构🌸 索引的数据结构(非常重要) mysql的索引的数据结构,并非定式!!!取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存…...

普及100Hz高刷+1ms响应 微星发布27寸显示器:仅售799元
不论办公还是游戏,高刷及低响应时间都很重要,微星现在推出了一款27寸显示器PRO MP273A, 售价只有799元,但支持100Hz高刷、1ms响应时间,还有FreeSync技术减少撕裂。 PRO MP273A的100Hz高刷新率是其最大的卖点之一&#…...

Java课题笔记~6个重要注解参数含义
1、[掌握]Before 前置通知-方法有 JoinPoint 参数 在目标方法执行之前执行。被注解为前置通知的方法,可以包含一个 JoinPoint 类型参数。 该类型的对象本身就是切入点表达式。通过该参数,可获取切入点表达式、方法签名、目标对象等。 不光前置通知的方…...
Windows Docker Desk环境时区问题导致的时间问题解决?
大多docker镜像为了保持镜像大小,采用了alpine linux。 但经常由于时区问题导致时间不准确,解决也很简单。 1.查看事件文件 cd /usr/share/zoneinfo 2.复制时区文件 将文件copy到 /etc/localtime 路径下即可(重庆时区,上海也…...

SpringBoot复习:(22)ConfigurationProperties和@PropertySource配合使用及JSR303校验
一、配置类 package cn.edu.tju.config;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component;Component ConfigurationPropertie…...
Spring IoC (控制反转)
IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则。 Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。…...
安卓下模拟渲染EGLImageKHR
创建AHardwareBuffer并填充颜色 AHardwareBuffer_Desc desc = {static_cast<uint32_t>(screenW),static_cast<uint32_t>(screenH),...
Spring MVC 框架学习总结
文章目录 初步认识 Spring MVC 框架 一、初识 Spring MVC 框架 二、 三、 四、 五、 六、 七、 八、 九、...
2、简单上手+el挂载点+v-xx(v-text、v-html、v-on、v-show、v-if、v-bind、v-for)
官网: vue3:https://cn.vuejs.org/ vue2:https://v2.cn.vuejs.org/v2/guide/ 简单上手: 流程: 导入开发版本的Vue.js <!--开发环境版本,包含了有帮助的命令行警告--> <script src"https…...

C++初阶语法——命名空间
前言:C,即cplusplus,顾名思义,是C语言promax版本,C兼容C语言。 C的诞生是因为贝尔实验室的本贾尼等大佬认为C语言的语法坑实在太多,拥有许多不足之处(比如命名冲突,)&…...

Axwing.878 线性同余方程
题目 给定n组数据ai, bi , mi,对于每组数求出一个xi,使其满足ai * xibi (mod mi),如果无解则输出impossible。 输入格式 第一行包含整数n。 接下来n行,每行包含一组数据ai , bi , mi。 输出格式 输出共n行,每组数…...

【Pytorch+torchvision】MNIST手写数字识别
深度学习入门项目,含代码详细解析 在本文中,我们将在PyTorch中构建一个简单的卷积神经网络,并使用MNIST数据集训练它识别手写数字。 MNIST包含70,000张手写数字图像: 60,000张用于培训,10,000张用于测试。图像是灰度(即…...
spring boot 集成rocketmq
集成Spring Boot和RocketMQ 在现代的微服务架构中,消息队列已经成为一种常见的异步处理模式,它能解决服务间的同步调用、耦合度高、流量高峰等问题。RocketMQ是阿里巴巴开源的一款消息中间件,性能优秀,功能齐全,被广泛…...
redis Hash类型命令
Redis中的Hash类型有多个常用命令可用于对Hash键进行操作。以下是一些常见的Redis Hash类型命令: HSET:设置Hash字段的值。 它将指定字段与相应的值关联起来,如果字段已经存在,则更新其值,如果字段不存在,…...

P1194 买礼物(最小生成树)(内附封面)
买礼物 题目描述 又到了一年一度的明明生日了,明明想要买 B B B 样东西,巧的是,这 B B B 样东西价格都是 A A A 元。 但是,商店老板说最近有促销活动,也就是: 如果你买了第 I I I 样东西࿰…...
oracle基础语法和备份恢复
Oracle总结 sql命令分类 1.DDL,数据定义语言,create创建/drop销毁 2.DCL,数据库控制语言,grant授权/revoke撤销 3.DML,数据操纵语言,insert/update/delete等sql语句 4.DQL,数据查询语言&am…...

【MATLAB第66期】#源码分享 | 基于MATLAB的PAWN全局敏感性分析模型(有条件参数和无条件参数)
【MATLAB第66期】#源码分享 | 基于MATLAB的PAWN全局敏感性分析模型(有条件参数和无条件参数) 文献参考 Pianosi, F., Wagener, T., 2015. A simple and efficient method for global sensitivity analysis based on cumulative distribution functions.…...
vue2过渡vue3技术差异点指南
基础点 reactive() 定义响应式变量(仅仅引用类型有效:对象数组map,set):reactive(),类似于data中return的数据 例子: import { reactive } from vueexport default {setup() {const state reactive({ count: 0 })function in…...

两个多选框(select)之间值的左右上下移动
<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>两个多选框(select)之间值的左右上下移动</title> </head> <script src"https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>&…...

【设计模式】——模板模式
什么是模板模式? 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
leetcode 386. 字典序排数 中等
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]示例 2: 输入:n 2…...

Github 2025-06-07 Rust开源项目日报Top10
根据Github Trendings的统计,今日(2025-06-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1TypeScript项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Ge…...
Vue 学习路线图(从零到实战)
🎯 学习目标:掌握 Vue 并能独立开发中大型项目 ✅ 适合人群:前端初学者、想快速上手做项目的开发者、中小型团队成员 🧭 Vue 学习路线图(从零到实战) 第一阶段:基础语法 核心功能(…...