MySQL学习总结(三)

MVCC机制

MVCC(Multi-Version Concurrency Control)多版本并发控制机制是一种用于支持数据库的并发事务处理的技术。在 MVCC 中,每个事务在读取数据库时,会看到一个固定版本的数据库快照。这个版本是在事务启动时确定的,也就是说,在事务执行过程中,即使其他事务对数据库进行了修改,当前事务也只会看到固定的版本,而不会受到其他事务的影响。

在 MVCC 中,每个数据行都有一个版本号,每次对数据行的修改都会增加版本号。在读取数据时,事务会记录下读取时的版本号,当事务提交时,将这个版本号作为提交版本号。当其他事务要修改这个数据行时,会对比提交版本号和当前版本号,如果提交版本号比当前版本号旧,则说明当前事务读取的是旧版本的数据,需要等待提交事务完成后再进行修改。

在 InnoDB 中,MVCC 机制是通过在每个数据行后面记录两个隐藏的列来实现的:创建版本号和删除版本号。创建版本号表示这个数据行被修改的最新版本,删除版本号表示这个数据行的删除版本号,当删除版本号不为 0 时,表示这个数据行已被删除。在事务启动时,每个事务都会得到一个唯一的事务 ID,每次对数据行进行修改时,都会将当前事务的事务 ID 作为创建版本号。在查询数据时,InnoDB 会根据事务的隔离级别来确定当前事务可见的数据行版本。

在 MVCC 的实现中,InnoDB 还采用了回收空间的机制,即将已经删除的数据行的空间回收利用。当一个数据行被删除时,InnoDB 并不会立即将其从磁盘上删除,而是将其标记为已删除,并将删除版本号记录在数据行中。当事务提交后,InnoDB 会定期清理已经标记为已删除的数据行,将其空间回收,以便于后续的操作使用。

总之,MVCC 机制是一种用于支持数据库的并发事务处理的技术,在 InnoDB 中,MVCC 机制通过记录数据行的版本号来实现,从而保证事务的隔离性和并发性,同时还采用了回收空间的机制来优化数据库的性能。

辅助索引和主键索引有什么区别

辅助索引(Secondary Index)和主键索引(Primary Key Index)的区别如下:

  1. 定义方式不同:主键索引在创建表时可以定义,它是一种必须指定的索引,每个表只能有一个。辅助索引则是在表创建完成后,随时可以再为表中的某个列添加索引。

  2. 作用不同:主键索引用于唯一标识表中每一行,并确保每一行都有唯一标识符。辅助索引则是为了提高查询效率,将某个列的值快速定位到表中的某些行。

  3. 索引值不同:主键索引存储的是整个每一行的数据。辅助索引则只存储相关列的值和该行所在的物理地址,而不是整个行的数据。

  4. 存储结构不同:主键索引和辅助索引都可以使用不同的存储引擎。在 InnoDB 存储引擎中,辅助索引存储方式为 B+ 树,而主键索引存储方式则为聚簇索引,在聚簇索引下的数据行是按照主键顺序存储的。

总的来说,主键索引是一种特殊的辅助索引,用于唯一标识表中每一行。辅助索引则是用于提高查询速度的一种方式,可以用于对单一列或多个列进行索引。

什么是聚簇索引?什么是非聚簇索引?二者之间有什么区别?

聚簇索引和非聚簇索引是数据库中两种不同的索引类型,它们之间的区别如下:

聚簇索引(Clustered Index):将数据存储和索引存储在同一个B-Tree中,根据索引顺序来组织表中的数据。换句话说,聚簇索引决定了表中数据的物理存储顺序,因此每个表只能有一个聚簇索引。

非聚簇索引(Non-Clustered Index):将索引存储和数据存储分开,索引存储在B-Tree中,数据存储在另一个地方。非聚簇索引只存储数据的地址,而不是数据本身。

聚簇索引和非聚簇索引的区别可以通过以下示例说明:

假设有一个学生表,包含学生姓名、学号、年龄等信息。在该表上创建聚簇索引时,系统会根据索引顺序来组织表中的数据,例如根据学号创建聚簇索引,那么学号相同的学生记录将会在物理上相邻存放,而且表中的数据按照学号的大小顺序排列。这样可以提高按照学号查询和范围查询的效率。

在同一个表上创建非聚簇索引时,系统会将索引存储在B-Tree中,数据存储在另一个地方,例如根据学生姓名创建非聚簇索引,那么该索引只存储学生姓名和对应的地址指针,而不是整个学生记录,地址指针指向实际存储该学生记录的位置。这样可以提高按照姓名查询的效率。

因此,聚簇索引和非聚簇索引的区别在于是否将索引和数据存储在一起,以及索引的内容是不是整个记录。选择何种索引类型应该根据具体情况来决定,一般来说,对于经常需要按照某个字段进行查询或排序的表,可以使用聚簇索引来提高查询效率;对于经常需要查询多个字段的表,可以使用非聚簇索引来提高查询效率。

聚簇索引和非聚簇索引是MySQL中两种不同类型的索引,它们的用途略有不同。

首先,聚簇索引主要用于对表中的数据进行物理排序。它是将索引和表数据存储到同一数据页(page)中的一种索引方式。因此,聚簇索引的性能比非聚簇索引更快,因为它可以减少磁盘I/O操作的次数。例如,对于经常需要按照某个字段进行查询或排序的表,可以使用聚簇索引来提高查询效率。聚簇索引通常只适用于主键或唯一键上,因为这些键具有唯一性,可以保证数据的物理排序。如果把一个不唯一的列作为聚簇索引,那么在插入数据时就会对索引进行频繁的调整,引起性能问题。

接下来,非聚簇索引是指把索引和表数据分别存储在不同的数据页中。因此,在使用非聚簇索引进行查询时,需要通过索引查询出数据行的主键,然后再通过主键从表中检索出对应的数据行。由于数据和索引都需要查询,所以非聚簇索引的查询性能比聚簇索引更低。但是,在经常需要查询多个字段的表上,使用非聚簇索引可以提高查询效率。比如,在一个包含许多列的表中,我们可能需要按照不同的字段进行组合查询。这时,如果使用一个复合聚簇索引,查询效率可能并不高。但是,如果我们添加几个非聚簇索引,对于每个需要查询的字段都建立索引,可以大大提高查询效率。

综上所述,聚簇索引和非聚簇索引都有各自的优势和劣势,在使用时需要根据实际情况进行选择。

B 树& B+树两者有何异同呢?

  1. B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。

  2. B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。

  3. B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。

  4. 在 B 树中进行范围查询时,首先找到要查找的下限,然后对 B 树进行中序遍历,直到找到查找的上限;而 B+树的范围查询,只需要对链表进行遍历即可。

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

你可能感兴趣的:(mysql,学习,数据库)