1).InnoDB 引擎的优势
- 如果服务器意外宕机了,只需要重启数据库即可。InnoDB 意外恢复自动完成在意外之前没有提交的操作。
- InnoDB 存储引擎拥有独自的缓存池,缓存池缓存表数据和索引数据在内存中,使得使用数据可以像在内存中一样。在专用于数据存储的服务器中,建议分配百分之八十的内存给缓存池。
- 在实行分表时,可以设置相关的外键来实现参照完整,更新或删除数据,相关的数据也将会被自动的更新或删除。
- 如果在磁盘或内存的数据损坏,InnoDB 校验机制在你使用此数据之前会提醒你数据异常。
- 插入,更新,删除操作会被更新缓存执行,你可以同时对同一张表读和写,InnoDB 会缓存更新的数据至磁盘
- 当表中同一行数据经常被查询,Adaptive Hash Index 帮助这些查询更快。
2).InnoDB 体系结构
官方的体系图如下:
InnoDB 体系结构实际上由内存结构,线程,磁盘文件三层组成。
先了解InnoDB 的存储结构
InnoDB 存储结构
InnoDB 逻辑存储单元主要分为表空间,段,区,页。
层级关系为tablespace -> segment-> extent (64 个 page ,1mb)->page.
InnoDB 存储引擎表中所有数据都是存在表空间中,表空间包括如下:
系统表空间
系统表空间包含InnoDB数据字典(InnoDB关系对象的元数据),并且它是doublewrite buffer, change buffer, 和 undo logs存储区域。系统表空间也包含表和索引数据给用户在系统表空间创建的表。系统表空间能有一个或多个数据文件,默认只有一个系统表空间文件ibdata1
在data目录下。系统表空间的大小和数量可以在innodb data file path 启动项配置。我们可以改变默认的配置:
[mysqld]
innodb_data_home_dir = /path/to/myibdata/
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
innodb_data_home_dir 是指定系统表空间文件的位置,innodb_data_file_path制定了系统表空间两个文件,一个名为为ibdata1的固定大小为50m的文件,另一个名为ibdata2的自动扩展大小为50m的文件。
独立表空间
只使用系统表空间,要仔细的计算好数据的增长,并且磁盘空间只能用于MySQL。独立表空间提供了一个更为灵活的选择,每个张InnoDB 引擎表具有自己的独立的表空间(.ibd file). 这个特性可以通过 innodb file per table 配置,默认是开启的。
独立表空间的优势:
- 能够获得磁盘空间,当你truncate 或者 dropp 一张具有独立表空间的表。
- 执行truncate 操作时更快
- 可以存储指定的一些表在不同的存储设备,在I/O操作,空间管理,备份中可以提升效率。
- 你能执行optimize table 操作压缩或者重建独立表空间,当你执行optimize table 时,innodb 会创建一个新的 .ibd文件并且分配一个临时的名字,使用实际数据大小的空间,当optimize 操作结束时,innodb 移除老的.ibd文件并且用新的替换。执行optimize 可以释放没有使用的空间。
- 可以迁移单张innodb 表,不至于整个数据库。
- 监控表的大小在文件系统水平,而不通过mysql
独立表空间的劣势:
- 会带来没有使用的空间,造成空间的浪费。
- 在
fsync
(将内存更新的数据同步在储存设备中,开销较大) 时,需要为每一个独立表空间都执行。需要InnoDB 执行多数的fsync
操作。 - 更多的描述文件。
通用表空间
和系统表空间相似,是一个共享的InnoDB 表空间 。可以通过create tablespace 来创建通用表空间
CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
创建表,并指定通用表空间(默认为独立表空间)
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
通用表空间的优势:
- 可以为多张表储存数据
- 相对于独立表空间,更加的节省空间
- 可以指定通用表空间的位置,相对于独立表空间,每张表都有表空间文件,更加的方便于管理。
- 支持alter table 移动表在通用表空间和独立表空间,或通用表空间和系统表空间。
通用表空间的优劣势:
- 一个已经分配好表空间的表不能更改为通用表空间。
- 不能创建临时的通用表空间
- 通用表空间不支持临时表
- 在使用truncate 或者 dropp 时,释放的空间只能用于新的InnoDB数据。
临时表空间
临时表的数据从系统表空间中抽离出来,形成独立的表空间,并且把临时表的相关检索信息保存在系统信息表的information_schema 库下的innodb_temp_table_info表中。但是目前还不能定义临时表空间文件的位置,只能与innodb_data_home_dir一致。