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.隔离性:并发执行事务时候,隔离性,会在执行效率和数据可靠之间做出权衡,隔离描述的是在同时执行的事务之间,相互的影响,隔离性越高,并发性越低,数据越可靠,性能也就越低。(下一篇会介绍并发的,家人们别急)

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕设 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往…

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

@Transactional详解(作用、失效场景与解决方法)

一、了解Transactional注解,先要知道事务是什么,但既然知道了这个注解,不知道事务是什么,那就重新再去学习一遍数据库吧,这里讲解开发中代码实现事务的方式 1、编程式事务(开发用的很少了) 基于…

【Linux】网络基础——宏观认识计算机网络

1 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 一开始,计算机发明出来之后,一台计算机处理完的数据,数据会保存在软盘(物理),通过人之间的相互通信,把计算机A处理完的数据存储到软…

与传统的学生宿舍供电系统相比预付费安全用电管理系统优势-安科瑞黄安南

摘 要:为消除高校学生因违章使用大功率电器,导致宿舍用电线路过载,从而引发火灾的隐患,文章将安全用电与用电管理统一考虑,设计并实施了安全用电智能控制与管理系统。对该系统的工作原理和功能进行了详细介绍&#xff…

python中数据可视化

1.掷一个D6和一个D10 50000次的结果 die.py from random import randintclass Die:def __init__(self, num_sides6):self.num_sides num_sidesdef roll(self):return randint(1, self.num_sides) die_visual.py from die import Die from plotly.graph_objs import Bar, L…

PoseiSwap:基于 Nautilus Chain ,构建全新价值体系

在 DeFi Summer 后,以太坊自身的弊端不断凸显,而以 Layer2 的方式为其扩容成为了行业很长一段时间的叙事方向之一。虽然以太坊已经顺利的从 PoW 的 1.0 迈向了 PoS 的 2.0 时代,但以太坊创始人 Vitalik Buterin 表示, Layer2 未来…

Kafka-消费者组消费流程

消费者向kafka集群发送消费请求,消费者客户端默认每次从kafka集群拉取50M数据,放到缓冲队列中,消费者从缓冲队列中每次拉取500条数据进行消费。

opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的…

C 语言高级1-内存分区,多级指针,位运算

目录 1. 内存分区 1.1 数据类型 1.1.1 数据类型概念 1.1.2 数据类型别名 1.1.3 void数据类型 1.1.4 sizeof操作符 1.1.5 数据类型总结 1.2 变量 1.1.1 变量的概念 3.1.2 变量名的本质 1.3 程序的内存分区模型 1.3.1 内存分区 1.3.1.1 运行之前 1.3.1.2运行之后 1…

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 (1)- 机器人视觉与YOLO V8 目标检测与跟踪 (1)- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…

苹果Vision Pro正式发布,下一个iPhone诞生了?

在库克即将退休之际,苹果开启了下一个十年。 2023年6月6日,在苹果WWDC开发者大会上,苹果发布了15寸的MacBook Air,以及一众iOS 17、iPad OS 17、Mac OS等系统的更新。当我们觉得这些常规更新有点不痛不痒,甚至想大呼“…

【uniapp 样式】使用setStorageSync存储历史搜索记录

<template><view><view class"zhuangbox u-flex"><u--inputplaceholder"请输入关键字搜索"border"surround"shapecircleprefixIcon"search"prefixIconStyle"font-size: 22px;color: #909399"v-model&q…

后端整理(MySql)

1 事务 1.1 事务ACID原则 原子性&#xff08;Atomicity&#xff09; 事务的原子性指的是事务的操作&#xff0c;要么全部成功&#xff0c;要么全部失败回滚 一致性&#xff08;Consistency&#xff09; 事务的一致性是指事务必须使数据库从一个一致状态转变成另一个一致性…

宇凡微2.4g遥控船开发方案,采用合封芯片

2.4GHz遥控船的开发方案是一个有趣且具有挑战性的项目。这样的遥控船可以通过无线2.4GHz频率进行远程控制&#xff0c;让用户在池塘或湖泊上畅游。以下是一个简要的2.4GHz遥控船开发方案&#xff1a; 基本构想如下 mcu驱动两个小电机&#xff0c;小电机上安装两个螺旋桨&#…

Eureka 学习笔记5:InstanceRegistry

版本 awsVersion ‘1.11.277’ LeaseManager 接口管理实例的租约信息&#xff0c;提供以下功能&#xff1a; 注册实例取消注册实例实例续约剔除过期实例 public interface LeaseManager<T> {/** 注册实例并续约*/void register(T r, int leaseDuration, boolean isRep…

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…

Python web实战之 Django 的 ORM 框架详解

本文关键词&#xff1a;Python、Django、ORM。 概要 在 Python Web 开发中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一个非常重要的概念。ORM 框架可以让我们不用编写 SQL 语句&#xff0c;就能够使用对象的方式来操作数据…

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…

Android kotlin系列讲解之最佳的UI体验 - Material Design 实战

目录 一、什么是Material Design二、Toolbar三、滑动菜单1、DrawerLayout2、NavigationView 四、悬浮按钮和可交互提示1、FloatingActionButton2、Snackbar3、CoordinatorLayout 五、卡片式布局1、MaterialCardView2、AppBarLayout 六、可折叠式标题栏1、CollapsingToolbarLayo…