MySQL基础
yatbfm

注:大多数内容参考了JavaGuide

MySQL

MySQL聚簇索引

https://javaguide.cn/database/mysql/mysql-index.html#%E8%81%9A%E7%B0%87%E7%B4%A2%E5%BC%95%E4%B8%8E%E9%9D%9E%E8%81%9A%E7%B0%87%E7%B4%A2%E5%BC%95
索引结构和数据一起存放的索引即聚簇索引,InnoDB中的主键索引属于聚簇索引,B+树的每个非叶子节点存储索引,叶子节点存储索引和对应的数据。
优点:

  1. 查询速度快,定位到了索引节点就定位到了数据,相比于非聚簇索引少了一次IO操作
  2. 对排序查找和范围查找优化,对于主键的排序查找和范围查找速度快

缺点:

  1. 依赖于有序的数据,如果索引属于UUID这种长且难比较的数据,插入或查找速度较慢。
  2. 更新代价大,如果修改了索引列的数据,对应的索引也会被修改,索引对应的叶子节点存放着数据也需要迁移,修改代价较大。所以主键索引,一般不修改主键。

MySQL中为什么使用B+树

  1. Hash表

通过key快速查找出对应的value,可以快速检索数据。发生哈希冲突可以采用链地址法解决哈希冲突。但是哈希索引不支持顺序和范围查找。

  1. 二叉搜索树BST

二叉搜索树的性能依赖平衡程度,不适合作为MySQL底层索引数据结构。

  1. AVL树

自平衡的二叉搜索树,需要频繁地进行旋转来保持平衡,会有较大的计算开销从而降低数据库写操作的性能;每个AVL树节点只存储一个数据,每次进行磁盘IO只能读取一个节点的数据,如果数据分布在多个节点,则需要进行多次IO。

  1. 红黑树

红黑树是一种自平衡二叉查找树,通过在插入和删除节点时进行颜色变换和旋转操作,使得树始终保持平衡状态,它具有以下特点:

  1. 每个节点非红即黑;
  2. 根节点总是黑色的;
  3. 每个叶子节点都是黑色的空节点(NIL 节点);
  4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
  5. 从任意节点到它的叶子节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。

不追求严格的平衡而是大致的平衡,查询效率稍有下降,因为树可能较高导致需要多次磁盘IO,但是红黑树的插入和删除操作效率大大提高了,红黑树在插入和删除节点时只需进行O(1)次数的旋转和变色操作。

  1. B树和B+树

B 树也称 B-树,全称为 多路平衡查找树 ,B+ 树是 B 树的一种变体。B 树和 B+树中的 B 是 Balanced (平衡)的意思。
目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结构。
B 树& B+树两者有何异同呢?

  • B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
  • B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
  • B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
  • 在 B 树中进行范围查询时,首先找到要查找的下限,然后对 B 树进行中序遍历,直到找到查找的上限;而 B+树的范围查询,只需要对链表进行遍历即可。

综上,B+树与 B 树相比,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。

B+树索引都存储了什么内容

B+树叶子节点存放索引和数据,其他节点只存放索引

MySQL四种隔离级别

  • 读未提交:最低的隔离界别,允许读取尚未提交的数据变更,可能导致脏读、不可重复读、幻读
  • 读已提交:允许读取并发事务已经提交的数据,可以阻止脏读,但可能存在不可重复读和幻读
  • 可重复读:对同一个字段的多次读取结果是一致的,除非事务本身修改数据。可以阻止脏读和不可重复读,幻读仍有可能发生。
  • 串行化:完全服从ACID的隔离级别,所有事务逐个执行,不会发生干扰。

mvcc机制(多版本并发控制)

https://javaguide.cn/database/mysql/innodb-implementation-of-mvcc.html
MVCC 是一种并发控制机制,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。它是通过在每个数据行上维护多个版本的数据来实现的。当一个事务要对数据库中的数据进行修改时,MVCC 会为该事务创建一个数据快照,而不是直接修改实际的数据行。

  1. 读操作

当一个事务执行读操作时,它会使用快照读取。快照读取是基于事务开始时数据库中的状态创建的,因此事务不会读取其他事务尚未提交的修改。具体工作情况如下:

  • 对于读取操作,事务会查找符合条件的数据行,并选择符合其事务开始时间的数据版本进行读取。
  • 如果某个数据行有多个版本,事务会选择不晚于其开始时间的最新版本,确保事务只读取在它开始之前已经存在的数据。
  • 事务读取的是快照数据,因此其他并发事务对数据行的修改不会影响当前事务的读取操作。
  1. 写操作

当一个事务执行写操作时,它会生成一个新的数据版本,并将修改后的数据写入数据库。具体工作情况如下:

  • 对于写操作,事务会为要修改的数据行创建一个新的版本,并将修改后的数据写入新版本。
  • 新版本的数据会带有当前事务的版本号,以便其他事务能够正确读取相应版本的数据。
  • 原始版本的数据仍然存在,供其他事务使用快照读取,这保证了其他事务不受当前事务的写操作影响。
  1. 事务提交和回滚
  • 当一个事务提交时,它所做的修改将成为数据库的最新版本,并且对其他事务可见。
  • 当一个事务回滚时,它所做的修改将被撤销,对其他事务不可见。
  1. 版本的回收
  • 为了防止数据库中的版本无限增长,MVCC 会定期进行版本的回收。回收机制会删除已经不再需要的旧版本数据,从而释放空间。

MVCC 通过创建数据的多个版本和使用快照读取来实现并发控制。读操作使用旧版本数据的快照,写操作创建新版本,并确保原始版本仍然可用。这样,不同的事务可以在一定程度上并发执行,而不会相互干扰,从而提高了数据库的并发性能和数据一致性。

事务的特性ACID

  • 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  • 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  • 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  • 持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
由 Hexo 驱动 & 主题 Keep
访客数 访问量