MySQL数据库 【索引事务】
目录
一、概念
二、索引的优缺点
1、索引的优点
2、索引的缺陷
三、索引的使用
1、查看索引
2、创建索引
3、删除索引
四、索引底层的数据结构
1、B树
2、B+树
五、索引事务
1、概念和回滚
2、事务的使用
3、事务的基本特性
4、并发会遇到的问题
(1)脏读
(2)不可重复读
(3)幻读
5、隔离级别
一、概念
二、索引的优缺点
1、索引的优点
现在假设有这么一个表:
比如,按照 id 这一列建立索引
在数据库上,我们就额外搞了一个空间,维护一些和 id 相关的信息,这里就通过一些特定的数据结构,维护表示 id 相关的索引的情况
后续再按照 id 来查询,就不必再直接遍历了,而是从索引中进行查询,根据索引就能够初步的锁定出数据所在的位置
2、索引的缺陷
1、消耗额外的空间
对于数据库来说,数据都是存储再硬盘上的,索引数据也是在硬盘上的
2、有可能会拖慢增删查改的速度
对于新增来说,此时不光要往表里面写数据,同时还要修改索引
如果删除、修改的条件如果刚好和索引匹配,速度还能快一点
但是如果涉及到索引列的删除 / 修改,这个时候,也要同时维护索引
三、索引的使用
1、查看索引
语法:
show index from 表名;
我们可以看到,目前 student 这个表中存在主键
当表中存在主键的时候,内部就会自动给这个 列 来创建索引
这是因为,主键不允许重复,因此进行插入 / 修改 操作的时候,就需要先查询,看看 插入 / 修改 后的结构是否已经存在
我们可以看到,使用 unique 约束的时候,也会自动生成索引
再重新创建一个 student 表和 class 表相关联
我们可以看到,班级表,由于 classId 是主键,自动生成了一个索引
学生表里面包含了两个索引,其中一个索引是由主键生成的,另一个是由于我们设置了外键约束所自动生成的索引
这是因为,外键这里也涉及到自动查询
1、给学生表中插入一条记录,就需要查询classId 是否在 class 表的 classId 中存在,这个查询就使用到了 class 表中的 classId (主键自动生成的索引)
2、给班级表中删除一条记录,就需要查询 classId 是否在学生表中存在
在上述情况中,主键、unique 、外键 这三种情况都会使 表 自动创建出索引
2、创建索引
语法:
create index 索引名 on 表名(字段名);
此时,就能够看到我们新创建出来的索引
这个创建索引操作可能会非常危险!!!
如果这个表是空的,或者表里面包含的数据本身就不多,创建索引就没事
如果表非空,并且里面包含了非常多的数据,那么创建索引会引起非常大规模的硬盘 IO 操作,进一步就会导致数据库被卡死
3、删除索引
语法:
drop index 索引名 on 表名;
删除索引,只能针对 手动创建的索引,自动生成的索引使不能被删除的
删除索引这个操作也是非常危险的,原因与前面创建索引类似
那么如果现在我们必须给一个已经创建了很多数据的表 创建 / 删除 索引,并且这个数据库还是生产环境的数据库,咋办?
数据库服务器往往也不是单台服务器,为了整个系统的可靠性,通常会搞多个MySQL服务器节点,这些节点的数据都是一样的,能够提高相同的服务(其中某个挂了也不影响大局
先准备好一个新的 MySQL 服务器,把表和索引都创建好,然后把数据都导入过来,再把要替换的MySQL服务器关闭,把新的MySQL 服务器替换上去就行了
四、索引底层的数据结构
MySQL 的索引的数据结构取决于MySQL使用的是哪一个存储引擎
MySQL这个程序,里面包含了很多个模块,有的是负责解析SQLDE ,有的是负责网络通信的,由的是负责存储数据的 ......
存储引擎本质上就是代码里的一个模块(这里包含了若干个代码文件以及一大堆具体的代码)
具体如何存储数据,MySQL支持多种存储方案,innodb 是当下最主流的一种方式
以往我们谈到的数据结构都是内存中的数据结构,但是我们数据库这块组织数据使用的数据结构则是在硬盘上的
内存上的数据结构,对于访问操作是不敏感的(找数据的过程,花时间多,但是真正访问的时候时间不多
硬盘上的数据结构,对于访问操作来说,比较敏感,读写一次硬盘开销远远大于内存
哈希表,O(1) 复杂度 查询 / 插入 / 删除 / 修改数据
但是并不适合数据库的查询场景,这是因为哈希表只能做这种精确查询,没法做模糊查询和范围查询
哈希表需要把指定的 kye 通过 hash 函数映射出一个具体的下标才能定位到具体的位置
红黑树,O(logN)复杂度 查询 / 插入 / 删除 / 修改数据
也不适合数据库的查询场景
元素有序,可以处理范围查询,最大的问题在于红黑树的高度,会在元素个数比较多的适合,变得比较高
B+ 树是为了数据库量身定做的数据结构
注意:当前目前的讨论都是围绕 MySQL 的 innodb 这个存储引擎进行的(其它的存储引擎中可能会用到 hash 作为索引,只能应对这种精准匹配的情况)
要了解 B+ 树,就需要先了解一下 B树
1、B树
B树 有时候会写作 B- 树,- 是连接符,不是减号
B树的核心思路,和之前学过的 " 二叉搜索树 " 差不多,B树 本质上是一个 N叉搜索树
N叉搜索树: 一个节点上可以保存 多个 kye ,N 个 key 就能延伸出 N + 1 个分叉来, N 个 kye 就划分出了 N + 1 个区间
B树查询元素的流程:
1、拿着要查询的元素,从根节点出发, 判定要查找的元素是否在根节点上存在
2、如果不存在,看这个元素是落在哪个区间里,就沿着这个区间的路线往下一个节点上找
3、最终找到叶子节点,还不存在,就是真的存在了
此时,每个节点上,都可以保存多个元素了
当总的元素个数固定的适合,相比于二叉搜索树,涉及到的节点的总数就大大降低了 ,同时树的高度也大大降低了
由此可知,B树的高度是远远小于二叉搜索树的,于是,在进行查询的时候,硬盘IO的次数也就减少了
对于数据库来说,每个节点都需要把数据从硬盘上读出来,才能进行比较
一个节点上有多个 key 和 一个节点上有一个 key ,硬盘IO的开销是差不多的
对于B树来说,在进行插入元素 和 删除元素 的时候,就涉及到 拆分 和 合并
一个节点 可以存多个 key ,但是也不能无限的存,当存储的 key 数量达到一定程度的时候,就需要把这个节点给拆分,把这个节点中的一部分 key 以树的子节点的方式,来进行重新组织,保持当前这个节点中的 key 数量始终不会太多,这样就会衍生出新的节点
2、B+树
B+ 树 才是数据库索引的主角,在B树的基础上,又针对数据库的查询场景做出了一些改进
B+ 树的特点:
上面是B + 树的特点,那么这些特点产生的优势是什么呢?
B+树的优势:
数据库的数据在逻辑意义上是以 "表" 的形式存储的
但是在物理意义上,不需要 “表格” 这样的数据结构,而是直接用 B+ 树 来存储这个表的数据,表格只是用户看起来这像是个表格
此时,非叶子节点的存储空间,消耗是非常小的,可以在内存中缓存一份!!!
此时,进行数据查询的时候,就可以直接通过 内存 来直接进行比较,从而更快速的找到叶子节点上的记录(又一次减少了硬盘IO的次数)
但是B树如果也要把元素存储到每个节点上,非叶子节点就会占据空间比较大,从而无法在内存中缓存了
五、索引事务
1、概念和回滚
事务的本质,就是把多个操作打包成一个操作来完成(让这多个操作,要么全都能执行成功,要么一个都不执行)
注意:一个都不执行,不是真的没有执行,执行是否成功,得执行了才知道
真正执行之前,是不知道在执行具体哪一步的时候会失败
如果是执行到中间的操作出错了,就需要将前面已经成功执行的操作进行还原,还原到最初没有执行的样子,我们将还原到最初没有执行的样子的这个操作称为: 回滚(rollback)
回滚是怎么样实现的呢?
只要把事务中执行的每个操作,通过特定的日志来记录数据库事务操作的中间过程,如果需要回滚,就直接把之前操作的 "逆操作" 来执行就可以了
那如果数据库服务器重启了呢?
因为我们是通过日志来记录事务执行的中间过程的,日志中的数据是始终在硬盘上存在的,即使是数据库服务器重启,就会在重新启动之后,针对之前没有回滚完的情况继续进行处理
2、事务的使用
(1)开启事务
start transaction;
(2)执行多条SQL语句
(3)回滚或提交事务
rollback/commit;
commit 提交事务:把这些SQL 按照原子的方式来进行执行(带有回滚机制)
rollback 手动触发回滚
一个事务务必要以这两个操作(提交事务和回滚)结尾!!!
如果没有这两个操作,接下里的各种 SQL 操作都会被认为是事务的一部分
3、事务的基本特性
事务的基本特性是非常重要的一个知识点
那么事务的基本特性有哪些呢?
1、原子性 :保证多个操作被打包成一个整体,要么能全部被正确执行,要么就一个都不执行
2、一致性 : 保证事务执行之前和事务执行之后,数据能够对上,数据不能离谱
(约束、回滚机制 是保证一致性的重要手段)
3、持久性 : 事务这里执行的各种操作,都是持久生效的(最终写入到硬盘中的),一旦事务执行成功了,这里的所以操作产生的修改,都是写到硬盘里的
4、隔离性 : 并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出平衡
"隔离" 描述的是同时执行的事务之间,相互的影响
隔离性越高,并发性就越低,数据越可靠,性能就越低
什么是并发呢?
可以简单理解成:同时执行
数据库是一个客户端 服务器 结构的程序,既然是服务器,服务器就可以同一时刻给多个客户提供服务,这多个客户端,都能够给服务器提交事务
如果提交的这两个事务,是修改不同的数据库 / 不同的表,相互之间是没有什么影响的
如果这两个事务,修改的是同一个表,就可能存在麻烦
当顺序上存在差异的时候,顺序的先后就可能会影响到最终的执行结果,这就是并发执行事务带来的问题
4、并发会遇到的问题
(1)脏读
此外,并发执行事务的时候,还有可能遇到脏读的情况
脏数据:临时的,并非是最终准确的结果
那么如何解决脏读问题?
给 "写" 操作加锁 ,一个事务A 写的时候,其它事务B不能读了,直到事务A 写完数据,提交事务,其它的事务B才能来读取数据
引入了 “写” 加锁,降低了两个事务之间的并发性,提高了隔离性,降低了效率,使数据更准确了
(2)不可重复读
在同一个读取数据的事务中,可能会涉及到多次操作,多个 "读" 操作读到的数据可能会不一样
如何应对不可重复读?
给 "读" 操作也加锁
给 "写" 操作加锁的意思:我在写的时候,别人不能读(除非使我写完提交,别人才能读),此时,别人读的过程中,我还可以再开启一个事务来写,第二个事务提交之前,其它读的事务读到的就是新版本数据了
给 "读" 操作加锁的意思:别人读的时候,我不能写了。
这个时候,并发程度又进一步降低了(执行效率降低了),隔离性进一步提高了(数据更可靠了)
(3)幻读
一个事务,在多次读的过程中,虽然多次读的数据的值是一样的但是结果集不同
比如:第一次读是10条记录,第二次读是11条记录,这11条记录中的10条和之前的10条是一模一样的,但是多出来一个,我们称为幻读
可以视为,是不可重复读的特殊情况
如何解决幻读?
办法只有一个: 串行化
彻底放弃并发执行事务,所有的事务都是一个挨着一个的串行执行(执行完一个事务,再执行下一个事务)
5、隔离级别
MySQL 提供了四种事务的隔离级别,MySQL可以配置自己的隔离级别是哪一个
1、read uncommitted (RU) 允许读未提交的数据(脏读、不可重复度、幻读),隔离性最低,并发程度最高,数据可靠性最低,效率最高
2、read commmittded (RC) 允许读取已经提交了的数据(给写加锁了),解决脏读、存在不可重复读和幻读,隔离性提高了,并发性降低了,数据可靠性提高了,效率降低了
3、repeatable read (RR)默认的隔离级别,可以重复读取数据(给写操作和读操作都加锁),解决了脏读和不可重复读的问题,存在幻读问题,隔离性又提高了,并发性又降低了,数据可靠性又提高了,效率又降低了
4、serializable 事务彻底的串行执行,解决了脏读、不可重复读、幻读的问题,隔离性最高,并发性最低(没有),数据最可靠,效率也最低
相关文章:

MySQL数据库 【索引事务】
目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 (…...

源码阅读:classnames
源码阅读:classnames 源码阅读:classnames简介源码解读indexdedupebind类型声明 学习与收获 源码阅读:classnames 简介 classnames 一个简单的 JavaScript 实用程序,用于有条件地将类名连接在一起。 可以通过 npm 包管理器从 n…...

【解惑笔记】树莓派+OpenCV+YOLOv5目标检测(Pytorch框架)
【学习资料】 子豪兄的零基础树莓派教程https://github.com/TommyZihao/ZihaoTutorialOfRaspberryPi/blob/master/%E7%AC%AC2%E8%AE%B2%EF%BC%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E6%96%B0%E6%89%8B%E6%97%A0%E7%97%9B%E5%BC%80%E6%9C%BA%E6%8C%87%E5%8D%97.md#%E7%83%A7%E5%BD%95…...

PostgreSQL中如何配置Huge page的数量
在了解如在PG中如何配置大页之前,我们先要对大页进行一定的了解,为什么要配置大页,配置大页的好处有哪些。 我们日常的操作系统中,程序不直接使用内存,而是使用虚拟内存地址来处理内存分配,避免计算的复杂…...

Mysql之binlog日志浅析
一、binlog日志简介 Binlog是MySQL数据库中的二进制日志,用于记录数据库中所有修改操作,包括增删改等操作。binlog以二进制格式保存,可以通过解析binlog文件来查看数据库的操作历史记录。binlog日志可以用于数据恢复、数据备份、数据同步等场…...

js 生成器函数
生成器函数(Generator Function):生成器函数是一种特殊的函数,可以通过yield关键字来暂停和恢复函数的执行,从而实现惰性计算和迭代器的功能。在例子中,我们定义了一个fibonacci生成器函数,它使…...

HCIP OSPF+BGP综合实验
题目 1、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名,并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中,运行OSPF协议或者BGP协议…...

牛客网Verilog刷题——VL46
牛客网Verilog刷题——VL46 题目解析答案 题目 根据题目提供的双口RAM代码和接口描述,实现同步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。 双口RAM端口说明: 同步FIFO端口说明: 双口RAM代码如下ÿ…...

C/C++开源库推荐
C/C开源库推荐 主要都是平常用到的,包含windows开发、android开发、后台开发、音视频开发、深度学习等等最后还附带几个其他语言开发的比较好的项目 GUI开发 qt 跨平台开发库,内部封装了各种跨平台工具,但是大多数情况下都被用作开发跨平台…...

git常用命令速查表
1.git add -u [<路径>]: 把<路径>中所有跟踪(tracked)文件中被修改过或已删除文件的信息添加到索引库。它不会处理未跟踪(untracked)的文件。省略<路径>表示:即当前目录。 2.git add -a [<路径&…...

让两个文件夹里的图片名字一模一样
为了做测试集,对应数据和真值 import os import datetimeimage_names os.listdir(r\Images) #print(image_names) #print(len(image_names))mask_names os.listdir(rG:\Mask) #print(mask_names) #print(len(mask_names))#根据你提供的文件名排序结果来看,问题可…...

会议OA系统会议管理模块开发思路(layui搭建)
目录 一.为什么要进行开发 1.开发目的 2.项目流程 A.发起会议请求过程 1.首先实现我们的多选下拉框功能! 2.时间组件功能,并且提交我们新增加的会议内容 3.在进行发起会议编码时遇到的问题,BUG 3.1.有点时候js访问不到路径 3.2在增加…...

rsync 远程同步
目录 一、Rsync 简介 二、同步方式 备份的方式 三、常用Rsync命令 四、配置源的两种表达方法 五、配置服务端与客户端的实验 启动 rsync 服务程序 发起端(192.168.158.21) 编辑 六. 发起端(客户端)配置 rsyncinotify c…...

PostgreSQL数据库中,查询时提示表不存在的解决办法
最近遇到一个奇怪的问题,以前从来没有遇到过,在postgres SCHEMA下执行select * from table1语句时,提示表不存在,而实际这个表确是存在的,只不过是在public SCHEMA下。在public SCHEMA下执行这个sql语句是没有问题的。…...

视频传输网安全防护体系
在电脑、手机信息安全保护得到广泛关注和普及的今天,监控摄像头等设备的安全防护仍为大众所忽略,大量视频监控网络的前端设备和数据没有任何保护,完全暴露在互联网中。 前端IP接入设备与后端业务系统处于直连状态,一旦有攻击者或…...

C# Blazor 学习笔记(1):Blazor基础语法,组件化和生命周期
文章目录 前言基础语法路由Page 页面元素条件生成if / elseforforeach 绑定参数绑定(赋值,单向)参数绑定(双向)事件绑定字典绑定 attributes 组件化如何使用Parameter 参数注入使用回调函数组件声明回调组件注入回调组…...

flutter 导出iOS问题2
问题1:The Swift pod FirebaseCoreInternal depends upon GoogleUtilities, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries) 参考 正如上图报错第三方…...

syn报文什么时候会被丢弃?
开启tcp_tw_recycle且在NAT下 tcp_tw_recycle重复利用time_wait sockets,会记录最近的连接时间戳,并丢弃远程主机(PAWS机制)所有不严格大于该时间戳的报文。这意味着如果主机在nat下,那么该nat下所有设备将会受影响 TCP半连接队列满了 在半…...

【C++】开源:Linux端V4L2视频设备库
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Linux端V4L2视频设备库。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…...

基于数据驱动的多尺度表示的信号去噪统计方法研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?
文章目录 前言现象原因如何顺序读取推荐阅读 前言 Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 现象 先看…...

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓+IOS前端纯原生源码
伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓IOS前端纯原生源码, 后端是java源码。...

C++推理
YOLOv5 OpenCV DNN C导出的 ONNX 模型示例的推理: https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpphttps://github.com/doleron/yolov5-opencv-cpp-python YOLOv5 OpenVINO C推理示例: GitHub - dacquaviva/yolov5-openvino-cpp-p…...

Day10-作业(SpringBootWeb案例)
作业1:完成课上预留给大家自己完成的功能 【部门管理的修改功能】 注意: 部门管理的修改功能,需要开发两个接口: 先开发根据ID查询部门信息的接口,该接口用户查询数据并展示 。(一定一定先做这个功能) 再开发根据ID…...

源码阅读:p-limit
源码阅读:p-limit 源码阅读:p-limit简介源码解读学习与收获 源码阅读:p-limit 简介 p-limit是一个用于限制并发操作的包,它可以控制同时执行的异步操作数量。它提供了一种简单的方式来管理并发操作,以避免系统资源过…...

目标检测-击穿黑夜的PE-YOLO
前言 当前的目标检测模型在许多基准数据集上取得了良好的结果,但在暗光条件下检测目标仍然是一个巨大的挑战。为了解决这个问题,作者提出了金字塔增强网络(PENet)并将其与YOLOv3结合,构建了一个名为PE-YOLO的暗光目标检…...

优化性能压力测试的关键策略和技巧
在现代软件开发中,性能压力测试是不可或缺的一环。它可以帮助开发团队评估系统在负载压力下的性能表现,识别潜在的性能瓶颈,并采取适当的措施进行优化。然而,仅仅进行性能压力测试是不够的,关键的在于如何优化测试的过…...

VMware Linux 可视化增加磁盘
1、VMware 增加磁盘 2、disks挂载磁盘 此处我挂载的是20G磁盘,截图只是用5G的做过程演示例子。 3、验证挂载磁盘...

从 axios 源码学习设计模式
文章目录 一、源码分析1.1 axios 为什么可以多种方式调用1.2 拦截器实现注册使用:promise链式调用 二、从 axios 看设计模式axios 的精髓在哪2.1 抽象工厂axios.create -- 创建新实例的工厂 2.2 微内核设计2.3 适配器思想2.4 责任链模式2.5 桥接模式举例:…...

输出不同程序执行的时间
简单的测试工具代码,它可以输出不同程序执行的时间。我们可以使用Python的time模块来实现这个功能。 import timedef test_function(func, *args, **kwargs):"""测试函数执行时间的工具函数:param func: 待测试的函数:param *args: 函数的位置参数:…...