Advantages of File-Per-Table Mode
1 当truncate或者drop一个表时可以释放磁盘空间。如果不是独立表空间,truncate或drop一个表只是在ibdata文件内部释放,实际ibdata文件并不会缩小,释放出来的空间也只能让其他innodb引擎的表使用(有时这会造成磁盘空间容量监控的一个痛点,无法判断它到底有多满)
2 独立表空间下,truncate table操作会更快
3 独立表空间下,可以自定义表的存储位置,通过CREATE TABLE ... DATA DIRECTORY = absolute_path_to_directory命令实现(有时将部分热表放在不同的磁盘可有效地提升IO性能)
4 独立表空间下,可以回收表空间碎片(比如一个非常大的delete操作之后释放的空间),alter table xxx engine=innodb
5 可以移动单独的innodb表,而不是整个database
6 可以copy单独的innodb表从一个实例到另外一个实例(也就是transportable tablespace特色)
7 独立表空间模式下,可以使用Barracuda的文件格式,这个文件格式有压缩和动态行模式的特色。这个当表中有blob或者text字段的话,动态行模式(dynamic row format)可以发挥出更高效的存储。
8 独立表空间模式下,可以更好的改善故障恢复,比如更加节约时间或者增加崩溃后正常恢复的机率。
9 单独备份和恢复某张表的话会更快
10 可以使得从一个备份中单独分离出表,比如一个lvm的快照备份
11 可以在不访问mysql的情况下方便地得知一个表的大小,即在文件系统的角度上查看。
12 在大部分的linux文件系统中,如果innodb_flush_method为O_DIRECT,通常是不允许针对同一个文件做并发写操作的。这时如果为独立表空间模式的话,应该会有较大的性能提升。
13 如果没有独立表空间模式,那么所有的东西都在共享表空间,而共享表空间是有64T的容量上限的(这点比较扯淡)
Potential Disadvantages of File-Per-Table Mode
1 独立表空间模式下,每个表或许会有很多没用到的磁盘空间,因为初始表空间大小是固定的吧,有些表根本没使用都这么多。如果没做好管理,可能会造成较大的空间浪费。
2 fsync操作必须运行在每一个单一的文件上,独立表空间模式下,多个表的写操作就无法合并为一个单一的IO,这样就添加许多额外的fsync操作
3 mysqld必须