MySQL问题记录- InnoDB 和 MyISAM 的区别是什么

390 阅读2分钟

InnoDB 和 MyISAM 的区别是什么?

InnoDB 和 MyISAM是两个不一样的引擎,区别的地方很多。我觉得最大的区别是以下几点。

  1. 事务的支持:InnoDB 支持事务,MyISAM 不支持事务
  2. 数据存储格式的区别:InnoDB 主键树是聚簇索引,数据放在主键树的叶子结点,数据文件有.frm .ibd .ibdata;MyISAM 是非聚簇索引,叶子结点没有直接存储数据,而是存储数据位置。他的数据文件有三种:.frm .myi .myd
  3. 锁的粒度:InnoDB锁的最小粒度是行锁,MyISAM锁的最小粒度是表锁
  4. 是否支持崩溃恢复:InnoDB通过binlog和redolog实现两阶段提交,支持崩溃恢复,而MyISAM不支持崩溃恢复。

这里引出两点:

  1. 聚簇索引
  2. 崩溃恢复

聚簇索引和非聚簇索引

1464190-20191106145143172-1760681728.png

聚簇索引:叶子结点放着数据。 非聚簇索引:叶子结点放着数据。

网上常说InnoDB的索引结构是聚簇索引,其实不全是。InnoDB的主键索引是聚簇索引,其他索引树并不是聚簇索引结构。

崩溃恢复

InnoDB 引擎与其他引擎有个很大的区别就是支持崩溃恢复。怎么支持的?我们可以首先看看下面这个图片。

2e5bff4910ec189fe1ee6e2ecc7b4bbe.webp

这个图片告诉我们在变更数据的时候会进行 两阶段提交

  1. 首先写入redo log 数据状态为prepare阶段
  2. 然后写入binlog
  3. 最后将redo log 中的数据状态标志位commit

两阶段提交能够有效的帮助崩溃恢复。可以试着用辩证的角度思考这个问题,比如先写redo log 在写binlog,或者先写binlog 再写redo log。后面两种情况在数据库崩溃后恢复,都会出现数据不一致的情况。