mysql:B+树/事务

B+树 : 为了数据库量身定做的数据结构

我们当前这里的讨论都是围绕 mysql 的 innodb 这个存储引擎来讨论的

其他存储引擎可能会用到hash 作为索引,此时就只能应对这种精准匹配的情况了

要了解 B+树 我们先了解 B树, B树 是 B+树 的改进

B树 有时候会写作 B-树 (这里的" - "是连接符)

B树 的核心思路和"二叉搜索树"差不多,一个节点上,可以保存多个 key ,N 个 key 就能延伸出 N+1 个分叉来,N 个 key 就划分出了 N+1 个区间(比如四个 key 就有五个分叉,三个 key 就有四个分叉)

B树 如下图所示

B树 查询元素的流程,拿着要查询的元素从根节点出发

比如我们要查询23,先看看23在不在根节点,如果不存在就看看23落在根节点的哪个区间,23<30,所以落在30左边的区间,再看看存不存在,不存在就看看又落在哪个区间,20<23<25,所以落在20~25中间这个区间,然后就在里面找到了23

此时每个节点上都可以保存多个元素,所以说当元素固定的时候,相较于二叉搜索树,涉及到的节点大大减少了,树的高度也大大降低了

B树 的高度是远远小于二叉搜索树的,于是进行查询的时候,硬盘 IO 的次数也就随之减少了(对于数据库来说每个节点都需要把数据从硬盘上读出来才能进行比较,B树 就能一次读取多个数据,每读取一次都是一次 IO,这下一次 IO 读取多个,次数就减少了)

一个节点上有多个 key 和一个节点上有一个key ,硬盘 IO 的开销是差不多的

对于 B树 来说,再进行插入元素和删除元素的时候,涉及到拆分和合并的操作

因为一个节点可以存多个 key,但是也不能无限存,当存储的 key 的数量达到一定程度的时候,就需要把这个节点给拆分,把这个节点中的一部分 key 以树的子节点的方式来进重新组织,这样就会衍生出新的叶子结点,当父节点被删了几个,叶子结点就会填补上

具体啥时候拆分,怎么拆分,具体啥时候合并,怎么合并,就看实际的视线了,不同场景下可以有不同的策略

B+树才是数据库索引的主角.在 B树 的基础上,又进一步地做出了一些改进(针对数据库的查询场景展开的)

1.B+树 也是N叉搜索树,但是N个 key 分出了N个区间,其中节点上的最后一个 key 就是最大值了(取最小值也行)

2.父节点的 key 会在子节点中重复出现(而且是以最大值的身份)

看起来有很多重复元素,但是包含了一个重要信息==>"叶子结点就是整个数据的全集"

3.把叶子节点按照类似于链表这样的方式,首尾相连,此时通过叶子节点之间的连接就可以快速找到"上一个""下一个"元素,也方便进行范围查询,比如我们要找<11的数据,先从根节点开始找,看11最后在叶子节点的哪个位置,然后从11开始到链表最左边的位置就是目标结果

上面三个是 B+树的特点,这些特点产生的优势是什么呢?

1.特别擅长范围查询

2.所有的查询操作,最终都会落到叶子节点上,比较次数是均衡的,查询时间稳定的

有的时候稳定比"快"更重要

3.由于叶子结点上是完整的数据全集,因此表的每一行数据都可以保存在叶子节点上,而非叶子节点值存储构建索引的 key 即可(只存简单的 Id 就行了)

其实在物理层面上不需要"表格"这样的数据结构,直接使用 B+ 树来存储这个表的数据,"表格"只是用户看起来这像是个表格而已

此时非叶子的存储空间消耗是非常小的,可以再内存中缓存一份,此时进行数据查询的时候,就可以通过内存来直接进行比较,从而更快地找到叶子节点上的记录,又进一步减少了键盘 IO 的次数

B树 如果也要把元素存储到每个节点上,非叶子节点就会占据较大的空间,从而无法再内存中缓存了

这里的面试题:介绍对数据库索引的认识,这里就包含该博客介绍的所有内容

事务

事务的基本情况

有的时候为了完成某个工作,需要多组 sql 操作

事务的本质就是为了把多个操作打包成一个操作来完成(让多个操作要么全都执行成功,要么就一个都不执行)

注意一个要点,"一个都不执行"不是真的没执行,执行成不成功得执行了之后才知道,真正执行之前是不知道哪一步会失败的,如果是执行到中间出错了,就需要自动地把前面已经成功执行的操作进行还原,还原回最初没执行的模样(给还原这个操作起了个名字叫做回滚 rollback)

回滚是怎么实现的? 只要把事务中执行的每个操作都记录下来(通过特定的日志),如果需要回滚,就直接按照之前的操作的"逆操作"来执行就可以了(比如插入的逆操作就是删除,删除的逆操作就是插入,修改的逆操作就是修改回去)

下面举个例子

start transaction 开启事务

开启事务后就可以输入多个 sql 语句了

commit 提交事务,把这些 sql 按照原子的方式来进行执行(带有回滚机制)

rollback 手动触发回滚

一个事物务必要以 commit 或者 rollback 这两个操作结尾,如果没有这俩操作,接下来的各种 sql 操作都会被认为是事务的一部分

上述操作不做演示,因为实际开发中往往使用程序代码来操作事务,不太会用命令操作事务 ,代码中操作事务和这几个命令差别较大

事务的基本特性(面试必考):

1.原子性: 保证多个操作被打包成一个整体,要么能够全部执行正确,要么就一个都不执行

2.一致性:事务执行之前和事务执行之后,数据能对得上,数据不能不靠谱

回滚机制不光支持了原子性,还支持了一致性

3.持久性: 事务这里执行的各种操作,都是持久生效的(最终写入硬盘中的),一旦事务执行成功,这里的所有操作产生的修改,都是写到硬盘里的(即使重启服务器,重启主机,它们也不会失效)

4.隔离性: 并发执行事务的时候 ,隔离性会在执行效率和数据可靠之间做出权衡,可以让程序员在使用的时候,根据实际需要来决定我们是要隔离性高一些数据可靠一些,还是要隔离性低一些效率高一些

"隔离"描述的是同时执行的事务之间相互的影响

隔离性越高,并发性就越低,数据越可靠,性能就越低

啥是并发? 简单理解为同时执行.

数据库是一个客户端服务器结构的程序,既然是服务器,服务器就可以同一时刻给多个客户端提供服务,这多个客户端就都能给服务器提交事务,如果提交的两个事务,是修改不同的数据库,修改不同的表,相互之间就没啥影响,但是修改的是同一个表的话,这个时候就可能存在麻烦 

下面举个例子,两个客户端都去修改同一个余额表

假设 客户端1 有两个操作,客户端2 有一个操作,两个客户端的操作必然有先后区别,造成的结果也就会不一样

所以最后的判定到底是根据1000还是3000?这是存在歧义的

这就是并发执行事务所带来的问题

脏读是我们并发执行事务中非常典型也非常常见的问题:

如何解决脏读问题?  给写操作加锁即可,事务A 写的时候,其他事务不能读了,直到事务A 写完数据,提交了事务,其他事务才能读取数据

引入了写加锁,降低了两个事务之间的并发性,提高了隔离性,降低了效率,使数据更准确了

不可重复读是我们并发执行事务中常见的问题:

如何应对不可重复读? 给读操作也加锁,别人读的时候就不能写了, 此时并发程度又进一步降低了,隔离性进一步提高了,执行效率变低了,数据可靠性更高了

解决幻读: 办法只有一个,串行化.彻底放弃并发执行事务,所有的事务都是一个挨一个的串行执行,执行完一个事物,再执行下一个事务,并发性最低,隔离性最高,效率是最低的,数据是最可靠的

Mysql 提供了四种事务的隔离级别

mysql 可以配置自己的隔离级别是哪个,咱们可以根据实际的需求场景来决定使用哪个隔离级别,找到一个效率和可靠性都能接受的情况,但是大部分情况下使用默认的隔离级别就够用了(repeatable read)

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

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

相关文章

axios 实现请求重试

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 请求重试的核心是可以重放请求&#xff0c;具体实现就是在 axios 中&#xff0c;拿到当前请求的 config 对象&#xff0c;再用 axios 实例&#xff0c;就能重放请求。 在无感刷新…

【WinForm详细教程七】WinForm中的DataGridView控件

文章目录 1.主要属性DataSource行&#xff08;Row 相关属性&#xff09;列&#xff08;Column 相关属性&#xff09;单元格&#xff08;Cell 相关属性&#xff09;逻辑删除AllowUserToAddRowsAllowUserToDeleteRowsAllowUserToOrderColumns其他布局和行为属性 2.控件中的行、列…

PHP foreach 循环跳过本次循环

$a [[id>1],[id>2],[id>3],[id>4],[id>5],[id>6],[id>7],[id>18],];foreach($a as $v){if($v[id] 5){continue;}$b[] $v[id];}return show_data(,$b); 结果&#xff1a;

ASTM F963-23美国玩具安全新标准发布

新标准发布 2023年10月13日&#xff0c;美国材料与试验协会&#xff08;ASTM&#xff09;发布了新版玩具安全标准ASTM F963-23。 主要更新内容 与ASTM F963-17相比&#xff0c;此次更新包括&#xff1a;单独描述了基材重金属元素的豁免情况&#xff0c;更新了邻苯二甲酸酯的管控…

上班族必备:制作电子宣传册的网站

​对于上班族来说&#xff0c;制作电子宣传册是一项非常重要的技能。因为宣传册是展示公司形象、产品特点、服务优势的重要工具&#xff0c;也是与客户沟通交流的重要手段。那么&#xff0c;如何制作一份高质量的电子宣传册呢&#xff1f;今天就为大家推荐几个制作电子宣传册的…

如何让 Bean 深度感知 Spring 容器

Spring 有一个特点&#xff0c;就是创建出来的 Bean 对容器是无感的&#xff0c;一个 Bean 是怎么样被容器从一个 Class 整成一个 Bean 的&#xff0c;对于 Bean 本身来说是不知道的&#xff0c;当然也不需要知道&#xff0c;也就是 Bean 对容器的存在是无感的。 但是有时候我…

【ChatGLM2-6B】P-Tuning训练微调

机器配置 阿里云GPU规格ecs.gn6i-c4g1.xlargeNVIDIA T4显卡*1GPU显存16G*1 准备训练数据 进入/ChatGLM-6B/ptuningmkdir AdvertiseGencd AdvertiseGen上传 dev.json 和 train.json内容都是 {"content": "你是谁", "summary": "你好&…

AI:53-基于机器学习的字母识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

推荐PHP付费进群源码

PHP付费进群源码带自动定位基于ThinkPHP框架开发的&#xff0c;可以快速搭建知识付费粉丝进群。 更新&#xff1a; 1.首页付款轮播 2.城市定位功能 3.更新及优化域名库及支付设置 4.新增一张图模板设置模式&#xff0c;简化后台模板设置 5.前后台其他优化 演示地址&#xff1a…

使用navicat操纵数据库

<1>连接数据库 打开Navicat&#xff0c;点击“连接”&#xff0c;选择“MySQL”&#xff0c;这边是本机安装的mysql,主机为localhost&#xff0c;输入root密码。 使用Navicat创建数据库并导入SQL文件 SQL查询 普通SQL查询 USE demo; SELECT * FROM t_emp;SELECT emp…

【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种

Spring全家桶中CacheEvict无效情况共有以下几种 一、背景介绍二、原因分析三、解决方案 一、背景介绍 SpringBoot中使用Cacheable注解缓存数据&#xff0c;使用CacheEvict注解删除缓存。但是在项目使用过程中&#xff0c;发现使用CacheEvict注解删除缓存无效。 拓展&#xff…

腾讯云优惠券是什么?腾讯云优惠券怎么领取?

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;为了吸引用户上云&#xff0c;经常推出各种优惠活动&#xff0c;其中就包括腾讯云优惠券。 1、腾讯云优惠券解释说明 腾讯云优惠券是腾讯云的一种优惠凭证&#xff0c;包括代金券和折扣券&#xff0c;领券之后新购、续费、升…

AD9371 官方例程裸机SW 和 HDL配置概述(三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

管理如何实现制度流程化 流程表单化 表单信息化 信息标准化?

业务化、流程化、信息化、数字化、自动化、智能化&#xff0c;是企业业务管理发展路径的六个必经阶段 制度业务化&#xff0c;业务表单化&#xff0c;表单流程化、流程信息化、信息标准化、标准制度华。 制度流程化、流程表单化、表单信息化、信息标准化、标准制度华。 管理…

Windows安装WinDbg调试工具

一.下载 微软官网下载SDK的地址&#xff0c;有win11&#xff0c;win10&#xff0c;win8&#xff0c;win7&#xff0c;其他 https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/ 二.安装 打开windbg\Installers\X64 Debuggers And Tools-x64_en-us.msi 要安…

【Redis】String字符串类型-常用命令

文章目录 String字符串类型常用命令setgetMGETMSET 计数命令INCRINCRBYDECRDECRBYINCRBYFLOAT 其它命令APPENDGETRANGESETRANGESTRLEN 命令总结 String字符串类型 1&#xff09;⾸先Redis中所有的键的类型都是字符串类型 2&#xff09;字符串类型的值&#xff08;value&#…

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载&#xff1a; a、使用curl下载&#xff1a;https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址&#xff1b;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件&#xff0c;下载地址&#xff1a;https…

云计算、大数据、人工智能、物联网、虚拟现实技术、区块链技术(新一代信息技术)学习这一篇够了!

目录 云计算 一、云计算的基本概念 二、云计算的分类 (一) IaaS (二) SaaS (三) PaaS 三、云环境的分类、云计算的四种部署模式 (一)公有云 (二)私有云 (三)社区云 (四)混合云 四、云计算的特点 (一)虚拟化技术 (二)动态可扩展 (三)按需部署 (四)灵活性高 (五…

左偏树学习笔记

定义 堆&#xff0c;是一棵树&#xff0c;且每个节点的键值都大于等于 / 小于其父亲的键值。 左偏树是一种可合并的堆&#xff0c;可以以 O ( log ⁡ n ) O(\log n) O(logn) 的复杂度实现合并。 性质 左偏树满足堆的性质。 我们设定一个值 dist \text{dist} dist&#xf…

692. 前k个高频单词(map)

目录 一、题目 二、代码 一、题目 692. 前K个高频单词 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution {class KV_sort{public:bool operator()(const pair<string,int> kv1, const pair<string,int> kv2){if(kv1.first kv2.first )//两个对…