InnoDB介绍
Last updated
Last updated
InnoDB是事务安全的mysql存储引擎,也是mysql的默认存储引擎,特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读。同时也被设计用来最有效地利用以及使用内存和CPU。
从InnoDB存储引擎的逻辑存储结构来看,所有数据都被逻辑地存放在一个空间中,称之为表空间。表空间依次由段(segment)、区(extent)、页(page)组成。页有时候也叫块(block)。
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行记录。
区别:
InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
索引都是使用B+树,但两者的实现方式不一样;
如何选择:
是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。
系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB;
MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你不知道用什么存储引擎,那就用InnoDB,至少不会差。