# InnoDB介绍

InnoDB是事务安全的mysql存储引擎，也是mysql的默认存储引擎，特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读。同时也被设计用来最有效地利用以及使用内存和CPU。

## 1. InnoDB逻辑存储结构

从InnoDB存储引擎的逻辑存储结构来看，所有数据都被逻辑地存放在一个空间中，称之为表空间。表空间依次由段（segment）、区（extent）、页（page）组成。页有时候也叫块（block）。

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2Fb4b630c151972f3f3df955e48cc9e8746854112c.png?generation=1589894636281734\&alt=media)

**1. 表空间**

所有的数据都存放在表空间中，包括数据、索引、插入缓冲Bitmap页、回滚（undo）信息、系统事务信息、二次写缓冲等。默认情况下InnoDB有一个共享表空间ibdata1，即所有数据默认存储在这个表空间内。如果用户启用了参数innodb\_file\_per\_table，则每张表内的数据可以单独放到一个表空间中。启用了这个参数，每张表的表空间内存放的只是数据、索引和插入缓冲页，其他类型的数据还是存放在共享表空间内。

**2. 段**

常见的段有数据段、索引段、回滚段等。在B+树中，数据段就是叶子节点，索引段就是非索引节点。

**3. 区**

区是由连续页组成的空间，在任何情况下，每个区的大小都是1MB，默认情况下，一个区中有64个连续的页。

**4. 页**

页是InnoDB磁盘管理的最小单位，默认大小为16KB，常见的页类型有：

* 数据页（B-tree Node）
* undo页（undo Log Page）
* 系统页（System Page）
* 事务数据页（Transaction system Page）
* 插入缓冲位图页（Insert Buffer Bitmap）
* 插入缓冲空闲列表页（Insert Buffer Free List）
* 未压缩的二进制大对象页（Uncompressed BLOB Page）
* 压缩的二进制大对象页（compressed BLOB Page）

**5. 行**

InnoDB存储引擎是面向列的，也就是说是按行存放数据的。每个页最多允许存放16KB / 2 - 200行的记录，即7992行记录。

## 2. InnoDB和Myisam区别

**区别：**

1. InnoDB 支持事务，MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一；
2. InnoDB 支持外键，而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败；   &#x20;
3. InnoDB 最小的锁粒度是行锁，MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表，导致其他查询和更新都会被阻塞，因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一；
4. 索引都是使用B+树，但两者的实现方式不一样；

**如何选择：**

1. 是否要支持事务，如果要请选择 InnoDB，如果不需要可以考虑 MyISAM；
2. 如果表中绝大多数都只是读查询，可以考虑 MyISAM，如果既有读写也挺频繁，请使用InnoDB。
3. 系统奔溃后，MyISAM恢复起来更困难，能否接受，不能接受就选 InnoDB；
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)，说明其优势是有目共睹的。如果你不知道用什么存储引擎，那就用InnoDB，至少不会差。
