数据库(总结自小林coding)|事务的四大特性、数据库的事务隔离级别、MySQL的执行引擎、MySQL为什么使用B+树来作索引

数据库(总结自小林coding)|事务的四大特性、数据库的事务隔离级别、MySQL的执行引擎、MySQL为什么使用B+树来作索引

事务的四大特性有哪些

事务的四大特性通常被称为 ACID 特性

  • 原子性 :一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节 ,而且事务在执行过程中发生错误 ,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样
  • 一致性 :是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态
  • 隔离性 :数据库允许 多个并发事务 同时对其数据进行读写和修改 的能力,隔离性可以 防止多个事务并发执行时由于 交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的
  • 持久性 :事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

数据库的事务隔离级别有哪些?

  1. 读未提交 (Read Uncommitted):
    • 指一个事务还没提交时,它做的变更就能被其他事务看到
    • 最低的隔离级别,存在脏读、不可重复读和幻读的问题。
  2. 读提交 (Read Committed):
    • 一个事务只能读取已经提交的数据,也就是 提交之后,它做的变更才能被其他事务看到
    • 解决了脏读问题,但仍可能出现不可重复读和幻读。
  3. 可重复读 (Repeatable Read):
    • 事务执行期间,多次读取同一数据会得到相同的结果,也就是 一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的
    • 解决了不可重复读问题,但仍可能出现幻读。
  4. 串行化 (Serializable):
    • 会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行
    • 最高的隔离级别,不会出现脏读、不可重复读和幻读。

所以,要解决 脏读现象,就要升级到**「读提交」**以上的隔离级别;要解决 不可重复读现象,就要升级到「可重复读 」的隔离级别,而要解决 幻读现象 不建议将隔离级别升级到「串行化」 。因为在「可重复读」隔离级别下,可以很大程度上避免幻读现象的发生(注意是很大程度避免,并不是彻底避免)而且 使用「串行化」隔离级别会影响性能

MySQL的执行引擎有哪些?

MySQL的执行引擎主要 负责查询的执行和数据的存储 , 其执行引擎主要有MyISAMInnoDBMemory 等。

  • InnoDB:InnoDB是MySQL的默认存储引擎,具有ACID事务支持、行级锁、外键约束 等特性。它适用于高并发的读写操作,支持较好的数据完整性和并发控制
  • MyISAM:MyISAM是MySQL的另一种常见的存储引擎,具有较低的存储空间和内存消耗 ,适用于大量读操作的场景。然而,MyISAM不支持事务、行级锁和外键约束,因此在并发写入和数据完整性方面有一定的限制。
  • Memery:将数据存储在内存中,适用于对性能要求较高的读操作,但是在服务器重启或崩溃时数据会丢失。它不支持事务、行级锁和外键约束

MySQL为什么使用B+树来作索引

B+树是一个B树的变种,提供了高效的数据检索、插入、删除和范围查询性能。

  • 单点查询:
    • B 树进行单个索引查询时,最快可以在 O(1) 的时间代价内就查到。从平均时间代价来看,会比 B+ 树稍快一些。
    • 但是 B 树的查询效率 波动会比较大,因为每个节点既存索引又存记录。有时候访问到了非叶子节点就可以找到索引,而有时需要访问到叶子节点才能找到索引。
    • B+树的非叶子节点不存放实际的记录数据 ,仅存放索引,所以数据量相同的情况下 ,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。
  • 插入和删除效率:
    • B+ 树有大量的冗余节点 ,删除一个节点的时候,可以直接从叶子节点中删除,树形结构变化很小 甚至不会发生复杂的树的变形
    • B+ 树的插入也是一样,由于有大量的冗余节点 ,就算节点饱和,可能存在节点的分裂,但是最多只涉及树的一条路径 。而B 树 没有冗余节点,删除节点的时候非常复杂,可能涉及复杂的树的变形
  • 范围查询
    • B+ 树 所有叶子节点间有一个链表进行连接,而 B 树没有这个结构,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。
    • 所以 存在大量范围检索 的场景,适合使用 B+树 ,比如数据库。而对于大量的单个索引查询 的场景,可以考虑 B 树,比如nosql的MongoDB。
相关推荐
银发控、4 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记4 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
一起养小猫6 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你6 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长6 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Henry Zhu1236 小时前
数据库(五):反规范化
数据库
Mr_Xuhhh6 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
he___H7 小时前
Redis高级数据类型
数据库·redis·缓存
霖霖总总7 小时前
[小技巧60]深入解析 MySQL Online DDL:MySQL Online DDL、pt-osc 与 gh-ost 机制与最佳实践
数据库·mysql
爱学习的阿磊7 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python