数据库(总结自小林coding)|事务的四大特性、数据库的事务隔离级别、MySQL的执行引擎、MySQL为什么使用B+树来作索引
事务的四大特性有哪些
事务的四大特性通常被称为 ACID
特性
- 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样
- 一致性:是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
- 隔离性:数据库允许 多个并发事务 同时对其数据进行读写和修改的能力,隔离性可以 防止多个事务并发执行时由于 交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
数据库的事务隔离级别有哪些?
- 读未提交(Read Uncommitted):
- 指一个事务还没提交时,它做的变更就能被其他事务看到
- 最低的隔离级别,存在脏读、不可重复读和幻读的问题。
- 读提交(Read Committed):
- 一个事务只能读取已经提交的数据,也就是 提交之后,它做的变更才能被其他事务看到
- 解决了脏读问题,但仍可能出现不可重复读和幻读。
- 可重复读(Repeatable Read):
- 事务执行期间,多次读取同一数据会得到相同的结果,也就是 一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的
- 解决了不可重复读问题,但仍可能出现幻读。
- 串行化(Serializable):
- 会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行
- 最高的隔离级别,不会出现脏读、不可重复读和幻读。
所以,要解决 脏读现象,就要升级到**「读提交」**以上的隔离级别;要解决 不可重复读现象,就要升级到「可重复读」的隔离级别,而要解决 幻读现象 不建议将隔离级别升级到「串行化」。因为在「可重复读」隔离级别下,可以很大程度上避免幻读现象的发生(注意是很大程度避免,并不是彻底避免)而且 使用「串行化」隔离级别会影响性能
MySQL的执行引擎有哪些?
MySQL的执行引擎主要 负责查询的执行和数据的存储, 其执行引擎主要有MyISAM
、InnoDB
、Memory
等。
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。