InnoDB 是 MySQL 的一种存储引擎,与传统的 ISAM 与 MyISAM 相比,InnoDB 的最大特色就是支持了 ACID 兼容的事务(Transaction)功能,类似于 PostgreSQL。

特点

1、支持事务安装

Innodb 在功能方面最重要的一点就是对事务安全的支持,实现了 SQL92 标准所定义的所有四个级别(READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ 和 SERIALIZABLE)。

2、数据多版本读取

Innodb 在事务支持的同时,为了保证数据的一致性已经并发时候的性能,通过对 undo 信息,实现了数据的多版本读取。

3、锁定机制的改进

Innodb 改变了 MyISAM 的锁机制,实现了行锁。虽然 Innodb 的行锁机制的实现是通过索引来完成的,但毕竟在数据库中 99%的 SQL 语句都是要使用索引来做检索数据的。

4、实现外键

Innodb 实现了外键引用这一数据库的重要特性,使在数据库端控制部分数据的完整性成为可能。

Innodb 的存储文件

1、数据文件(表数据和索引数据)

存放数据表中的数据和所有的索引数据,包括主键和其他普通索引。

在 Innodb 中,存在了表空间(tablespace)这样一个概念,但是他和 Oracle 的表空间又有较大的不同。

Innodb 的表空间分为两种形式:一种是共享表空间,也就是所有表和索引数据被存放在同一个表空间(一个或多个数据文件)中,通过 innodb_data_file_path 来指定,增加数据文件需要停机重启;另外一种是独享表空间,也就是每个表的数据和索引被存放在一个单独的.ibd 文件中。

InnoDB 为独立表空间模式,每个数据库的每个表都会生成一个数据空间

独立表空间优点

  1. 每个表都有自已独立的表空间。

  2. 每个表的数据和索引都会存在自已的表空间中。

  3. 可以实现单表在不同的数据库中移动。

  4. 空间可以回收(除 drop table 操作处,表空不能自已回收)

缺点

单表增加过大,如超过 100G

共享表空间在 Insert 操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files。

2、日志文件

Innodb 的日志文件和 Oracle 的 redo 日志比较类似,同样可以设置多个日志组(最少 2 个),同样采用轮循策略来顺序的写入,甚至在老版本中还有和 Oracle 一样的日志归档特性 。

如果数据库中有创建了 Innodb 的表,那么千万别全部删除 innodb 的日志文件,因为很可能就会让数据库 crash,无法启动,或者是丢失数据。

由于 Innodb 是事务安全的存储引擎,所以系统 Crash 对他来说并不能造成非常严重的损失,由于有 redo 日志的存在,有 checkpoint 机制的保护,Innodb 完全可以通过 redo 日志将数据库 Crash 时刻已经完成但还没有来得及将数据写入磁盘的事务恢复,也能够将所有部分完成并已经写入磁盘的未完成事务回滚并将数据还原。

ib_logfile 存储 redo log,由参数 innodb_log_files_in_group 确定个数,参数 innodb_log_group_home_dir 确定存储路径,命名从 ib_logfile0 开始,依次写满 ib_logfile 并顺序重用。

如果最后 1 个 ib_logfile 被写满,而第一个 ib_logfile 中所有记录的事务对数据的变更已经被持久化到磁盘中,将清空并重用之。