MySQL - 索引 与 事务

news2024/11/25 18:31:19

前言

本篇介绍MySQL的索引与事务,了解底层索引B+树的基本思想, 了解事务的4大特征, 隔离性解决事务并发等问题; 如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
  • 1. 数据库索引
    • 1.1 B树
    • 1.2 B+树
  • 2. 事务
  • 总结

本文开始

1. 数据库索引

索引: 能够加快查找的速度,快速搜索数据
索引底层不一定线性的,数据像一条一条的,还可能是树型结构的, 像B+树;

这里我们简单了解一下B树,B+树的思想;
了解B+树, 先说一下B树;

1.1 B树

B树: 是一种N叉搜索树, 每个节点中存储多个key, 根据key划分子树,左树中key小于父节点中key,右树中key大于父节点中key; 节点中key增多, 每层就子树增多, 使树的层数减少, 数据库查找读取IO次数减少,增加了查找的速度;
B树的特点:(参考下图理解特点)

  1. 树 的每个节点可以存储多个key值,树的每个key存储着一条数据 (n个key划分n+1个区间)
  2. 左树中key小于父节点中key,右树中key大于父节点中key
  3. 树的父节点有n个key, 它的孩子节点根据区间划分产生n+1个孩子

区间划分:
左子树是小于30的范围的, 中间子树是大于30小于40的范围, 右子树是大于40的范围; 子树依次往下划分;

在这里插入图片描述

1.2 B+树

B+树: B树的进一步优化, 查找数据比较稳定 => B+树的数据都存储在叶子节点, IO访问次数基本一致(不会像B树那样次数不一);

B+树的特点:(参考下图理解特点)

  1. 每个节点有多个key值, 它的数据都存储在叶子节点(没有左右孩子), 可以认为非叶子节点存储着数据的序号, 查找真正的数据必须到叶子节点上; IO访问次数基本一致(稳定性);(n个key划分n个区间)
  2. 一个节点保存多个Key值, 降低树的高度, 减少了IO访问次数;
  3. B+树叶子节点首尾相连, 类似一个链表(下图蓝框部分)
  4. 叶子节点存储完整的数据, 非叶子节点只存储key本身
  5. B+树的所有数据构成链表, 方便范围查找
  6. B+树的非叶子节点只存储key,不是完整的数据, 只有访问叶子节点是进行IO访问, 所以减少了IO访问次数

区间划分:以图为例
规则: 左子树的区间小于20的值, 但是父节点的20必须在子树中, 并且是子树的最大值;
右子树区间范围20到30, 且它的最大值为父节点中的key(30);
剩下范围重复上述步骤;

在这里插入图片描述

2. 事务

事务: 多条sql语句组成的整体, 执行事务要么全部成功, 要么失败; 如果执行一半失败, 会进行回滚操作, 回复到原来的sql语句;

事务的4大特性:

  1. 原子性: 整体,不能分割;
  2. 一致性: 更改前后数据一样
    例如: A向B转账: A账号减100, B账号就加100; 减少增加数据一样;
  3. 持久性: 修改后的数据不会再变;
    A账号减少100后不会改变
  4. 隔离性: 解决事务并发产生的问题,

隔离性解决事务并发的经典问题:
① 脏读问题
问题描述:
事务A正在修改文件, 还没有提交, 事务B此时读取文件(同一份文件), 会产生 “脏读” 问题;
提交后的文件, 可能与A没有提交前写的文件不相同;
解决: 给事务A, 写加锁
为了让B读取的文件不变, 给事务A写加锁; 这样在提交后, 文件与B看到的相同(A正在修改的时候的文件);
② 不可重复读问题
问题描述:
事务A写完文件, 提交了文件(第一次提交), 事务B读取文件, 事务B正在读取文件, 此时事务A再次修改文件, 并提交文件(第二次提交), 事务B读着读着文件内容改变了(变成事务A修改的新内容), 此时就产生了 “不可重复读” 的问题; <=> 事务B多次读取文件不一致就是不可重复读的问题 <=>同一个事务多次读取, 读取的结果数据不一样
解决: 给事务B读加锁
给B加锁, 保证了B在读取文件的过程中, 文件内容不会改变;
③ 幻读问题
问题描述:
事务A写加锁, 事务B读加锁的情况下, 事务B正在读取文件, 事务A创建新的文件写这个文件, 此时事务B读着读着就发现事务A写的新文件, 此时就是 “幻读” 问题; (事务A写了新文件, 但是旧文件不会改变, 新文件是在旧文件的下面位置) <=> 同一个事务读取同一份数据, 数据值(原来的数据)一样, 数据集(可能会有新的数据文件+原来数据)不一样;
解决;
串行化, 放弃并发处理多个事务, 一个一个执行事务;(先执行事务A, 再执行事务B…)


MySQL隔离的四种级别:

在这里插入图片描述


总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

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

相关文章

Linux -- 查看进程 top命令 详解

我们上篇介绍了&#xff0c; Linux 中的进程等概念&#xff0c;那么&#xff0c;在Linux 中如何查看进程呢 &#xff1f;&#xff1f;我们常用到的有两个命令&#xff0c; PS 和 top 两个命令&#xff0c;今天先来介绍下 top 命令~&#xff01;top 命令 &#xff1a;主要是 交…

Unity 入门精要00---Unity提供的基础变量和宏以及一些基础知识

头文件引入&#xff1a; XXPROGRAM ... #include "UnityCG.cginc"; ... ENDXX 常用的结构体&#xff08;在UnityCg.cginc文件中&#xff09;&#xff1a;在顶点着色器输入和输出时十分好用 。 关于如何使用这些结构体&#xff0c;可在Unity安装文件目录/Editor…

解压缩工具:Bandizip 中文

bandizip是一款可靠和快速的压缩软件&#xff0c;它可以解压RAR、7Z、ZIP、ISO等数十种格式&#xff0c;也可以压缩7Z、ZIP、ISO等好几种常用格式&#xff0c;在压缩文件方面毫不逊色于winrar&#xff0c;适用于多核心压缩、快速拖放、高速压缩等功能&#xff0c;采用了先进快速…

csapp第二章 --- 信息的表示和处理

本章重点纲要 目录 2.1 数据存储 2.1.1 进制 2.1.2 数据在内存的存储方式---大小端 2.1.3 C语言的一些知识 2.2 整数表示 2.2.1 二进制表示整数 2.2.2 扩展、截断 2.3 整数运算 2.3.1 加减法与溢出 2.3.2 逆元和补码的非 2.3.3乘法 2.4浮点数 2.4.1 IEEE规则 2.…

2023年中职组网络安全竞赛——综合渗透测试解析

综合渗透测试 题目如下: PS:需求环境可私信博主,求个三连吧! 解析如下: 通过本地PC中的渗透测试平台KALI2020对服务器场景进行渗透攻击,获取到RSYNC服务所开放的端口,将RSYNC服务开放的端口数值进行MD5加密后作为FLAG提交(如MD5加密前:812);

spark性能调优(二):内存

Memory 一、spark内存简介二、堆内内存 or 堆外内存?三、如何用好RDD Cache?四、OOM怎么办?一、spark内存简介 spark 2.0后,基本上spark内存的管理就已经自动化了,内存出现问题基本上是一些数据问题。比如数据倾斜 spark.executor.memory是绝对值,指定了executor进程的JVM…

毕业设计 基于stm32舞台彩灯控制器设计app控制系统

基于stm32舞台彩灯控制器设计app控制1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STM32F103C8T6核心系统电路设计2.2 WS2812RGB彩灯电路设计3、部分代码展示3.1 控制WS2812显示颜色3.2 设置RGB灯的颜色&#xff0c;角度&#xff0c;亮度实物图1、项目简介 选题指导…

Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构&#xff0c;其官网地址为&#xff1a;http://pluma-framework.sourceforge.net/。该架构是个轻量级架构&#xff0c;非常易于理解。 Pluma 架构有以下基本概念&#xff1a; 1&#xff09;插件的外在行为体现为一个…

JavaSE:集合框架

为什么用集合框架如果不知道需要多少对象&#xff0c;或者用较为复杂的方式存储对象&#xff0c;可以用集合框架集合框架包含的内容ArrayList实践.size().add(Object o&#xff09; .add(int index, Object o).get(int index).contains(Object o).remove(Object o) .remove(int…

高精度电流源如何设计出来

随着科技的不断进度&#xff0c;高精度电流源在自动测试/测量以及各种应用中承担着重要的作用。然而想要更高精度的指标参数&#xff0c;就需要电流源仪器研发得更完善。众所周知&#xff0c;高精度电流源是电子实验中重要的测试仪器&#xff0c;能够广泛应用在电化学、电光源、…

深入理解Windows操作系统机制(一)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。我们每天都在用Windows操作系统&#xff0c;但是其实我们每天直接在打交道的并不是Windows操作系统的内核&#xff0c;而是Windows操作系统的…

pytorch入门7--自动求导和神经网络

深度学习网上自学学了10多天了&#xff0c;看了很多大神的课总是很快被劝退。终于&#xff0c;遇到了一位对小白友好的刘二大人&#xff0c;先附上链接&#xff0c;需要者自取&#xff1a;https://b23.tv/RHlDxbc。 下面是课程笔记。 一、自动求导 举例说明自动求导。 torch中的…

Python 数据库连接 + 创建库表+ 插入【内含代码实例】

人生苦短 我用python Python其他实用资料:点击此处跳转文末名片获取 数据库连接 连接数据库前&#xff0c;请先确认以下事项&#xff1a; 您已经创建了数据库 TESTDB.在TESTDB数据库中您已经创建了表 EMPLOYEEEMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。连…

前端css整理

如何水平垂直居中一个盒子&#xff1f; 1.已知高度&#xff1a;子盒子设置 display: inline-block; 父盒子设置 line-height 等于高度实现垂直居中&#xff1b;使用 text-align:center实现水平居中 2.父盒子 display:flex; align-items:center;justify-content:center; 3.定位&…

自动驾驶决策规划-控制方向学习资料总结(附相关资料的链接)

项目仓库 欢迎访问我的Github主页 项目名称说明chhCpp学习C仓库chhRobotics学习自动驾驶、控制理论相关仓库(python实现)chhRobotics_CPP学习自动驾驶、控制理论相关仓库(c实现)chhML 、chh-MachineLearning学习机器学习仓库chhRL学习强化学习仓库chhTricks存放一些有意思的t…

SpringSecurity的初次邂逅

【第一篇】SpringSecurity的初次邂逅 1.Spring Security概念 Spring Security是Spring采用 AOP思想&#xff0c;基于 servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。 Spring Security是一个功能强大且高度可定制的身…

vue权限控制和动态路由

思路 登录&#xff1a;当用户填写完账号和密码后向服务端验证是否正确&#xff0c;验证通过之后&#xff0c;服务端会返回一个token&#xff0c;拿到token之后&#xff08;我会将这个token存贮到localStore中&#xff0c;保证刷新页面后能记住用户登录状态&#xff09;&#xf…

颠覆你的认知,业务同事都能开发软件,我简直无地自容……

经常看到网络鼓吹业务人员也能搭建应用&#xff0c;本是嗤之以鼻、半信半疑&#xff0c;但当这件事真实发生在自己身上时&#xff0c;竟觉得此言不虚&#xff1f; 一、背景 最近公司为了集成系统、提升扩展能力&#xff0c;引进了低代码平台JNPF&#xff0c;说个题外话&#…

终于,OpenAI开放ChatGPT API,成本直降90%,百万token才2美元

现在&#xff0c;第三方可以通过 API 将对话模型 ChatGPT 和语音转文本模型 Whisper 集成到自己的应用程序和服务中了。 来源丨机器之心 2022 年 11 月&#xff0c;OpenAI 上线 ChatGPT&#xff0c;自此以后&#xff0c;这个对话模型一路开挂。毫不夸张的说&#xff0c;与 Ch…