阿丹:
在mysql中innodb是默认的存储引擎。研究一下为什么它会被独宠。
官方解释:
InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。
InnoDB采用双轨制授权,一个是GPL授权,另一个是专有软件授权。
双轨制:
双轨制授权指的是InnoDB采用的一种授权方式,它同时提供两种不同的授权方式,一种是GPL授权,另一种是专有软件授权。
GPL授权是一种开源许可,它要求对源代码进行公开,并遵循相应的开源规定。在这种授权方式下,任何人都可以获取并使用InnoDB的源代码,对其进行修改和再发布。
专有软件授权是一种封闭的授权方式,它不允许对源代码进行公开或修改。在这种授权方式下,InnoDB的源代码是封闭的,只有获得授权的人才可以获取和使用。
双轨制授权的目的是为了满足不同用户的需求,有些用户可能更喜欢使用开源软件,有些用户则更喜欢使用封闭的软件。通过同时提供两种授权方式,InnoDB可以更好地满足不同用户的需求。
简介:
InnoDB是一个支持ACID事务、行级锁定和高并发的事务型数据库引擎,它与MySQL服务器紧密集成。以下是有关InnoDB存储引擎的要点总结:
-
数据存储和索引:InnoDB将表和索引存储在一个表空间中,而不是像MyISAM表那样分别存储在不同的文件中。这个表空间可以由多个文件组成,并且在操作系统上没有2GB文件大小限制。
-
事务支持:InnoDB支持完整的事务处理,符合ACID(原子性、一致性、隔离性和持久性)属性。它允许在事务中包含多个SQL语句,并提供回滚和提交功能。
-
多版本并发控制:InnoDB使用多版本并发控制(MVCC)来处理并发访问,使得读取操作不会被写入操作所阻塞,提高了并发性能。
-
行级锁定:InnoDB支持行级锁定,这意味着只锁定需要修改的行,而不是锁定整个表或页面。行级锁定减少了锁冲突,允许更多并发操作。
-
外键约束支持:作为MySQL中第一个支持外键约束的引擎,InnoDB可以确保关联表之间的数据完整性,并执行级联操作(如级联删除和更新)。
-
缓冲池:InnoDB在内存中维护了一个专门的缓冲池,用于高速缓存数据和索引。这提高了数据的访问速度和整体性能。
-
可靠性:InnoDB具有崩溃恢复功能,它会将未完成的事务日志记录下来,并在数据库重新启动时进行恢复,保证数据的一致性。
-
可混合使用:InnoDB可以与其他MySQL表引擎混合使用。在一个查询中,你可以自由地将InnoDB表与其他类型的表混合,并实现复杂的查询操作。
innodb存储引擎底层知识--基础大纲:
InnoDB存储引擎的底层实现是基于B+树和聚簇索引的存储结构。
-
表空间(Tablespace):InnoDB存储引擎以表空间的形式存储数据。每个InnoDB数据库都由一个或多个数据文件组成的表空间来存储表和索引数据。
-
页(Page):InnoDB存储引擎将数据划分为固定大小的页(一般为16KB)。每个页都是独立的存储单元,包含表数据、索引数据和一些元数据信息。
-
B+树索引:InnoDB使用B+树来组织和存储索引数据。B+树是一种高效的平衡搜索树,它通过在每个节点中保存多个关键字和指向子节点的指针来支持高效的数据查找。
-
聚簇索引(Clustered Index):InnoDB将每个表的主键索引与数据页合并成为一个聚簇索引。聚簇索引决定了数据在磁盘上的存储顺序,使得通过主键的查询变得非常高效。由于数据和索引在同一位置存储,聚簇索引还提供了较好的数据局部性,减少了磁盘IO的需求。
-
辅助索引(Secondary Index):除了聚簇索引外,InnoDB还支持辅助索引,也就是普通的非主键索引。辅助索引的叶子节点包含索引字段的值以及对应的主键值,通过主键值可以快速定位到相应的行数据。
补充:!!!!
Mysql--技术文档--索引-《索引为什么查找数据快?》-超底层详细说明索引_一单成的博客-CSDN博客
存储结构--B+树
Mysql--技术文档--B树-数据结构的认知_一单成的博客-CSDN博客
Mysql--技术文档--B+树-数据结构的认知_一单成的博客-CSDN博客
MVCC:
Mysql--技术文档--MVCC(Multi-Version Concurrency Control | 多版本并发控制)_一单成的博客-CSDN博客
总之,InnoDB是一个功能强大的存储引擎,专注于提供高性能、事务支持和并发控制。它的特点包括数据的可靠性、行级锁定、外键约束和多版本并发控制。由于这些优势,InnoDB成为处理大数据量和多用户并发操作的首选存储引擎。
重要理解:
mysql中innodb的控制并发就是结合了mvcc和乐观锁
Mysql--技术文档--悲观锁、乐观锁-《控制并发机制简单认知、深度理解》_一单成的博客-CSDN博客
在MySQL的InnoDB存储引擎中,控制并发的机制是结合了MVCC(多版本并发控制)和乐观锁的思想。InnoDB使用MVCC来管理版本和数据一致性,并使用乐观锁来实现并发控制。
MVCC机制通过使用事务ID、undolog指针和行ID等字段来跟踪和管理不同版本的数据。它为每个事务创建数据的版本,并通过版本号或时间戳来识别不同的数据版本,从而避免并发操作之间的冲突。
乐观锁的思想在MVCC中起着重要的作用。当事务读取或修改数据时,并不会立即加锁,而是先获取数据的版本信息。事务在操作数据之前,会对版本信息进行验证,确保操作的是合适的数据版本。如果发现冲突,乐观锁会回滚事务或触发相应的冲突处理逻辑。
结合了MVCC和乐观锁的机制,MySQL的InnoDB存储引擎能够提供较高的并发性能和数据一致性。读操作不需要加锁,事务之间可以并发执行,从而提高了系统的吞吐量。而在涉及写操作时,乐观锁会通过版本管理和验证来确保数据的一致性和隔离性。
正因为InnoDB结合了MVCC和乐观锁的机制,使得MySQL在处理并发访问时能够提供高效而可靠的并发控制。
ACID事务
ACID是事务处理的四个关键属性的首字母缩写,指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。下面是对每个属性的解释:
-
原子性(Atomicity):事务是一个不可再分割的工作单元,要么全部执行成功,要么全部不执行,不会发生部分执行的情况。如果事务中的任何操作失败,系统将撤销已执行的操作,将数据库恢复到事务开始之前的状态。
-
一致性(Consistency):事务的执行将使数据库从一种一致状态转换为另一种一致状态。这意味着在事务执行结束后,数据库必须满足所有定义的规则、约束和完整性条件,以确保数据在逻辑上的正确性。
-
隔离性(Isolation):事务的隔离性确保并发执行的事务之间相互隔离,每个事务都认为它是唯一正在运行的事务,不受其他并发事务的干扰。它通过使用锁机制和并发控制算法来处理潜在的并发访问冲突。
-
持久性(Durability):一旦事务成功提交,其所做的更改将永久保存在数据库中,即使系统遇到故障或崩溃。持久性通过将事务日志记录在持久存储器(如磁盘)上来实现,以便在系统故障恢复后可以进行恢复和重放操作。
ACID事务属性保证了数据库操作的正确性、稳定性和一致性,使得数据库在多用户并发访问和故障恢复时能够保持可靠性。事务的概念是数据库管理系统中非常重要的一个概念,并在许多关系型数据库中得到广泛支持和实现。
事务场景描述--方便认知:
-
原子性(Atomicity) - 假设有一个转账操作,要从一个账户A向另一个账户B转移100元。在一个原子性的事务中,要么转账成功并且金额从A账户减少并添加到B账户,要么如果任何一步出错,都会回滚到转账之前的状态,确保不会出现只有一步操作成功的情况。
-
一致性(Consistency) - 假设有一个电子商务网站,当顾客下订单时,需要扣除库存。在一个一致性的事务中,库存会根据订单数量进行减少,并且只有在库存充足的情况下才会扣除,以保持数据的一致性。如果库存不足,事务将回滚,订单不会被处理,确保库存和订单之间的一致性。
-
隔离性(Isolation) - 假设同时有两个用户在进行查询和更新操作。在一个具有隔离性的事务中,每个用户的操作都是相互独立的,互不干扰。例如,如果用户A正在更新一个记录,用户B进行查询操作时,用户B将只能看到事务开始之前的记录,而不会看到用户A正在更新的中间状态。这保证了并发事务的数据隔离性,避免了脏读(Dirty Read)等问题。
-
持久性(Durability) - 假设数据库管理系统突然发生故障或系统崩溃,在一个具有持久性的事务中,已提交的事务的修改将被永久保存在数据库中。当系统恢复正常后,即使在故障期间的数据丢失,数据库也会回滚这些事务并且还原到最近一次提交的状态,以确保数据的持久性和一致性。这可以防止业务数据的丢失或损坏
行级锁定
InnoDB支持行级锁定,这意味着只锁定需要修改的行,而不是锁定整个表或页面。行级锁定减少了锁冲突,允许更多并发操作。
在InnoDB中,行级锁定是通过多版本并发控制(MVCC)来实现的。MVCC使用了版本号和回滚段来管理并发访问和修改数据的冲突。每个被修改的行都会有一个版本号,并且在修改期间生成一个新的版本,在读取时,事务只能看到早于其启动的版本的行。这样,当多个事务同时修改同一行时,它们不会发生冲突,因为每个事务都会操作不同的版本。
在底层实现上,InnoDB使用了以下几个关键组件来支持行级锁定:
-
锁:InnoDB使用排他锁(X锁)和共享锁(S锁)来实现行级锁定。事务在修改数据时会获得X锁,其他事务想要修改同一行时需要等待,但其他事务可以同时读取该行。事务在读取数据时会获得S锁,多个事务可以同时获得S锁,但如果有事务持有X锁,则其他事务需要等待。
-
锁等待和死锁检测:如果一个事务请求的锁被其他事务占用,它就会进入等待状态,直到锁可用。InnoDB使用死锁检测算法来检测和解决死锁情况,如果发现死锁,其中一个事务将会被回滚以解开死锁。
-
事务隔离级别:InnoDB支持多个事务隔离级别,如读未提交、读提交、可重复读和串行化。不同的隔离级别对锁定和并发访问的影响不同,可以根据应用程序的需求选择适当的隔离级别。
总之,在InnoDB中,行级锁定通过MVCC实现,使用排他锁和共享锁来控制并发访问和修改数据库中的行。这种方式能够提高并发性能,并确保数据的一致性和可靠性。
缓冲池(InnoDB Buffer Pool):
InnoDB在内存中维护了一个专门的缓冲池,用于高速缓存数据和索引。这提高了数据的访问速度和整体性能。
InnoDB的缓冲池是一块内存区域,用于存储数据库中的数据和索引页面。它是InnoDB存储引擎的关键组成部分,用于提高数据库系统的性能和响应速度。
缓冲池的作用是将磁盘上频繁访问的数据和索引页面缓存在内存中,以减少磁盘的读写操作。通过将数据保留在内存中,可以加快对数据的访问速度,提高系统的响应能力。
当应用程序需要读取或修改一部分数据时,首先会检查缓冲池中是否存在该数据页。如果数据页已经在缓冲池中,应用程序可以直接从内存中读取或修改数据,而无需进行磁盘IO操作。这可以大大加快数据的访问速度。
如果数据页不在缓冲池中,系统将从磁盘读取相应的数据页到缓冲池,并在之后的访问中保留在内存中,以便提供更快的访问。当数据页被修改后,对应的内存中的数据也会被更新,而这些修改会在适当的时候被刷新回磁盘。
通过使用缓冲池,InnoDB可以减少对磁盘的IO操作,提高数据库的性能和吞吐量。合理配置缓冲池的大小可以有效地利用可用内存资源,并最大程度地减少磁盘IO的需求。
请注意,缓冲池的大小可以通过相关的配置参数进行设置,如innodb_buffer_pool_size
。根据系统的需求和可用的内存资源,可以适当地调整缓冲池的大小以获得最佳的性能。
缓冲池中的底层以及工作方式:
在InnoDB中,缓冲池是一种用于存储数据库表数据和索引的内存缓存区域。它的主要目的是提高数据库的性能和响应速度。缓冲池使用了一种叫做“buffer pool”的机制来管理和调度内存空间。
下面是缓冲池的底层实现原理和工作方式:
-
缓冲池管理:缓冲池由一个固定大小的页面数组组成,每个页面的大小通常是16KB。缓冲池会根据需要自动地从磁盘上读取数据页面到内存中,并根据LRU(最近最少使用)算法进行页面替换。当需要查询或修改某个数据表时,InnoDB首先会在缓冲池中搜索所需的数据页面,如果找到则直接返回,否则会从磁盘读取。读取的数据页面会被放入缓冲池中,并且在内存中被缓存一段时间供后续的查询使用。
-
脏页管理:当数据发生修改时,InnoDB会将修改后的数据写入到缓冲池中,并将对应的页面标记为“脏页”。当脏页需要写入到磁盘时,InnoDB使用一种叫做“写前日志(Write Ahead Log, WAL)”的技术来确保数据的一致性和持久性。在写前日志的过程中,先将修改的数据写入到日志文件中,然后再将脏页写入磁盘。这样即使发生故障或者崩溃,通过恢复机制,可以从日志文件中回放操作,恢复到最新的一致状态。
-
LRU算法:缓冲池中的页面采用LRU(最近最少使用)算法进行管理。当需要新的页面空间时,InnoDB会尝试从缓冲池中选择最近最少使用的页面进行替换,以便为新的页面腾出空间。这样,在频繁访问的数据页面上保持较高的缓存命中率,提高查询性能。
总之,InnoDB的缓冲池通过管理内存中的页面数组来缓存数据表和索引的页面,使用LRU算法进行页面替换。它优化了数据库的IO操作,提高了查询响应速度和并发性能。脏页管理和写前日志技术确保数据的一致性和持久性,避免了意外故障的损失或损坏