MySQL 中 InnoDB和Myisam

目录

一、MySQL的InnoDB引擎

1、逻辑存储结构

2、架构

3、事务原理

二、InnoDB和Myisam的区别


一、MySQL的InnoDB引擎

1、逻辑存储结构

InnoDB的逻辑存储结构主要是由 表空间、段、区、页、行,这些组成部分构成了InnoDB的逻辑存储结构,通过这个结构,InnoDB实现了高效的数据存储索引管理,并提供了强大的事务支持和并发控制功能。

  • 表空间:是InnoDB存储引擎逻辑结构的最高层,用于存储记录、索引等数据。每张表都有一个表空间。一个MySQL实例可以有多个表空间。

  • 段:InnoDB中的段分为数据段、索引段、回滚段。数据段是B+树的叶子节点,存储实际数据;索引段是B+树的非叶子节点,用于索引;回滚段用于事务的回滚操作。

  • 区:是表空间的单元结构,每个区的大小为1MB。一个区中包含64个连续的页。

  • 页:是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB每次从磁盘申请4-5个区。

  • InnoDB存储引擎以行的方式存放数据。每行有两个隐藏字段:Trx_id用于记录对应的事务ID,Roll_pointer用于指向旧版本的数据,通过它可以找到记录修改前的信息。

2、架构

InnoDB是一种事务型存储引擎,具有崩溃恢复特性。其架构分为以下几个部分:

  • 内存数据和索引缓存:为了提高读写性能,InnoDB使用缓存来存储热点数据和索引。InnoDB采用了缓冲池(Buffer Pool)来缓存数据和索引,缓冲池的大小可以通过参数innodb_buffer_pool_size设置。InnoDB还提供了多个缓存,如自适应哈希索引缓存(Adaptive Hash Index)、重做日志缓存(Redo Log Buffer)和数据字典缓存等。

  • 磁盘数据和索引存储:InnoDB使用表空间来存储数据和索引,每个表的数据和索引分别保存在对应的表空间文件(.ibd文件)中。InnoDB采用的是B+树索引结构,将数据和索引存储在同一个表空间文件中。

  • 事务控制和多版本并发控制(MVCC):InnoDB支持ACID事务,每个事务都被视为一个整体执行,支持事务的原子性、一致性、隔离性和持久性。InnoDB使用多版本并发控制(MVCC)技术来实现高并发的读写操作,即可以在不同事务间保证数据的一致性。InnoDB使用undo日志来存储事务的旧版本数据,通过回滚指针来定位到旧版本数据。

  • 锁机制:InnoDB使用行级别的锁,通过MVCC技术来实现高并发控制。对于读操作,InnoDB使用共享锁(S锁)来锁定数据,多个事务可以同时读取同一份数据;对于写操作,InnoDB使用排它锁(X锁)来锁定数据,只有一个事务可以写入数据,其他事务无法读取和写入。

  • 高可用和复制:InnoDB通过MySQL自带的复制功能来提供高可用性和备份支持。MySQL的主从复制和多源复制都可以使用InnoDB存储引擎进行数据同步,以提高系统的可用性和可靠性。

3、事务原理

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

特性有如下:

• 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

• 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

• 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

• 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

MySQL的InnoDB引擎是如何保证事务的这四大特性的。
这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久化,实际上是由InnoDB中的两份日志来保证的,一份是redo log日志,一份是undo log日志。 而持久性是通过数据库的锁,加上MVCC来保证的。

  • 原子性:InnoDB使用事务日志(Transaction Log)来保证原子性。在进行事务操作时,会将修改操作写在事务日志中,并在提交事务时将数据持久化到硬盘上。如果事务发生错误,可以通过回滚日志(Undo Log)来恢复数据,确保事务的原子性。

  • 一致性:InnoDB通过MVCC机制和锁机制来保证数据的一致性。MVCC机制会为每条数据加上一个版本号,当前事务只能访问该版本号之前的数据版本,从而避免读取到并发事务中的未提交数据。同时,InnoDB使用排他锁和共享锁等不同的锁类型来控制并发事务之间的读写操作,从而保证数据的一致性。

  • 隔离性:InnoDB通过不同的锁策略和隔离级别来保证事务之间的隔离性。MySQL支持四种隔离级别:未提交读(read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行读(serializable)。隔离级别越高,数据并发性越低,但数据的一致性和隔离程度更高。InnoDB使用排他锁、共享锁和MVCC机制等来实现隔离性。

  • 持久性:InnoDB通过重做日志(Redo Log)来保证事务的持久性。在数据更新时,InnoDB首先会将数据写入到内存中,在事务提交时,会将内存中的数据写入到重做日志中,然后再将数据持久化到硬盘中。如果系统崩溃,事务可以通过重做日志来恢复数据。

总结就是

  1. 逻辑存储结构:表空间、段、区、页、行。
  2. 架构:内存结构、磁盘结构。
  3. 事务原理:原子性-undo log,持久性-redo log,一致性-undo log+redo log,隔离性-锁+MVCC
  4. MVCC:记录隐藏字段、undo log版本链、readView

二、InnoDB和Myisam的区别

InnoDB和MyISAM是MySQL数据库中两种常用的存储引擎。之间的区别如下:
1、事务支持:InnoDB支持事务(transaction),而MyISAM不支持事务。事务是一组数据库操作,要么全部成功,要么全部失败回滚。这意味着InnoDB可以提供更好的数据完整性和一致性,而MyISAM在处理事务时存在风险。

2、行级锁和表级锁:InnoDB采用行级锁,在对数据行进行读写操作时只锁定涉及的行,而MyISAM使用表级锁,对一张表中的数据进行读写操作时会锁住整张表。因此,在并发访问和更新的情况下,InnoDB通常拥有更好的性能和并发控制能力。

3、外键约束:InnoDB支持外键约束(foreign key constraints),而MyISAM不支持外键约束。外键约束可以保证数据的引用完整性,使得数据库的数据关系更为严谨。

4、崩溃恢复:InnoDB具有更好的崩溃恢复能力,支持数据库的完全恢复和点对点恢复,而MyISAM在崩溃后容易发生数据损坏,恢复较为困难。

5、全文索引:MyISAM支持全文索引(full-text index),可用于全文搜索,而InnoDB在MySQL 5.6之后才开始对全文索引提供支持。

空间占用:一般情况下,InnoDB的表在磁盘上占据的空间较大,因为它需要保留事务日志和其他辅助数据;而MyISAM的空间占用相对较小。但是在MySQL 5.7之后,InnoDB引入了压缩表功能,可以显著减少存储空间的占用。

如果对于需要事务支持、高并发以及数据完整性要求较高的场景,推荐使用InnoDB存储引擎;而对于较为简单的查询和读写操作,不需要事务支持的场景MyISAM也是一个合适的选择。

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值