二、数据库引擎

1、MySQL存储引擎MyISAM与InnoDB区别

MySQL存储引擎是MySQL数据库的核心组件之一,用于管理数据的存储和检索。其中,MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们有以下区别:

  1. 数据存储方式不同:MyISAM采用表级锁定机制,对于读操作和写操作都会锁定整个表,而InnoDB采用行级锁定机制,对于读操作和写操作只会锁定需要操作的行,这样可以大大提高并发性能。

  2. 数据的完整性:MyISAM不支持事务和外键,而InnoDB支持ACID事务和外键,可以保证数据的完整性和一致性。

  3. 索引的实现方式:MyISAM使用B+树作为索引结构,而InnoDB使用B+树作为聚集索引(也就是数据存储的物理顺序),同时还支持辅助索引(也称非聚集索引)。

  4. 性能表现:MyISAM在执行大量SELECT操作的场景下,性能比InnoDB更好,而InnoDB在执行大量INSERT、UPDATE、DELETE操作的场景下,性能比MyISAM更好。

  5. 文件存储方式:MyISAM表的数据和索引是分开存储的,每个MyISAM表对应三个文件,即表结构定义文件(.frm)、数据文件(.MYD)、索引文件(.MYI),而InnoDB是将表的数据和索引存储在同一个数据文件(.ibd)中。

总的来说,MyISAM适合大量的读操作和少量的写操作的场景,而InnoDB适合大量的写操作和少量的读操作的场景,同时InnoDB也具有更好的数据完整性和可靠性。在实际应用中,根据业务场景的不同,可以根据需要选择不同的存储引擎来满足业务需求。

2、MyISAM索引与InnoDB索引的区别?

MyISAM和InnoDB是MySQL中两种常用的存储引擎,它们在索引实现方式上有一些区别。

  1. 索引结构不同:MyISAM使用B+树结构作为索引,而InnoDB使用B+树结构作为聚簇索引。MyISAM的索引结构中只包含键值,而InnoDB的聚簇索引中包含了整个行的数据。

  2. 存储方式不同:MyISAM表的数据和索引是分开存储的,每个MyISAM表对应三个文件,即表结构定义文件(.frm)、数据文件(.MYD)、索引文件(.MYI)。而InnoDB表的数据和主键索引都存储在同一个文件中,称为聚簇索引(clustered index),非主键索引存储在另外一个文件中。

  3. 锁定机制不同:MyISAM采用表级锁定机制,对于读操作和写操作都会锁定整个表,而InnoDB采用行级锁定机制,对于读操作和写操作只会锁定需要操作的行,这样可以大大提高并发性能。

  4. 对空间的使用不同:由于InnoDB的聚簇索引中包含了整个行的数据,所以在使用InnoDB的时候,需要预留足够的空间来存储整个行的数据。而MyISAM中的索引只包含键值,所以需要更少的空间来存储索引。

总的来说,InnoDB在保证数据完整性和并发性能方面具有优势,适合于需要支持事务处理的应用场景。而MyISAM在只读或者大量写操作较少的场景下可以提供更好的性能。在实际应用中,需要根据业务需求和具体场景选择适合的存储引擎。

3、InnoDB引擎的4大特性

InnoDB是MySQL中的一种常用存储引擎,具有以下四大特性:

  1. 事务支持:InnoDB支持事务处理,可以使用ACID(原子性、一致性、隔离性、持久性)模型来保证数据的完整性和一致性。

  2. 行级锁定:InnoDB支持行级锁定,即每次只锁定需要访问的行,而不是锁定整个表,这可以大大提高并发性能。

  3. 外键约束:InnoDB支持外键约束,可以在多个表之间建立引用完整性约束,保证数据的一致性。

  4. MVCC(多版本并发控制):InnoDB通过使用MVCC机制来实现高并发性能。MVCC是通过保存数据的多个版本来实现的,每个版本对应一个时间戳,读操作可以访问旧版本的数据,而写操作会创建新版本的数据,这样可以避免读写操作之间的互相干扰。

这些特性使得InnoDB在保证数据一致性和高并发性能方面具有很大的优势,适合于需要支持事务处理的应用场景。但是,在一些只读或者大量写操作较少的场景下,MyISAM可能会提供更好的性能。在实际应用中,需要根据业务需求和具体场景选择适合的存储引擎。

4、存储引擎选择

5、什么是MVCC(多版本并发控制)

MVCC(Multi-Version Concurrency Control,多版本并发控制)是InnoDB存储引擎用来实现并发访问控制的一种机制。它通过为每个事务保存多个版本的数据,来支持不同事务之间的隔离和并发访问,保证了InnoDB存储引擎的高并发性和数据一致性。

MVCC的基本原理是,对于每个数据行,InnoDB会保存多个版本的数据,每个版本有一个时间戳(或者版本号)。读操作可以访问旧版本的数据,而写操作会创建新版本的数据。当事务提交时,InnoDB会将该事务创建的所有新版本数据的时间戳设置为提交时间,这些数据版本称为“当前版本”。

当一个事务开始时,InnoDB会为该事务分配一个唯一的事务ID(Transaction ID),并使用该ID为该事务创建的所有新版本数据设置时间戳。当该事务进行读操作时,它只能访问早于它开始时间的数据版本,而不能访问该事务创建的新版本数据或其他事务已经提交的版本。

在InnoDB中,MVCC主要由以下几个组成部分:

  1. Undo日志:InnoDB使用Undo日志记录每个事务的修改操作,以便回滚操作和MVCC机制的实现。

  2. Read View:每个事务在开始时,InnoDB会为其创建一个Read View,用于保留该事务开始时的数据库快照。Read View包括当前正在进行的所有活跃事务的ID,以及它们创建的所有当前版本数据的时间戳。在事务进行读操作时,InnoDB会使用该事务的Read View来确定它可以访问哪些数据版本。

  3. 版本链和快照读:InnoDB通过版本链的方式来实现数据版本的保存和查找。当一个事务进行写操作时,InnoDB会创建新版本的数据,并将该数据的指针插入到版本链的头部。而读操作则可以通过快照读(Snapshot Read)的方式访问旧版本的数据,即InnoDB会根据当前事务的Read View,从版本链的尾部开始查找,直到找到最新的早于该事务开始时间的数据版本。

MVCC 的实现对于事务的并发性和性能有很大的帮助,但也带来了一些问题。例如,如果一个事务更新了一个数据行多次,那么每个版本都会被保存在数据库中,这样就会占用大量的存储空间。另外,由于每个事务都需要维护自己的 read view,因此在高并发场景下,会带来额外的开销和复杂性。

Last updated