正如您已经指出-innodb_file_per_table
将决定一个表将被存储在一个文件或(如果分区)在许多文件中。
以下是每种方法的一些优点和缺点(不需要完整列表)。
Single file per table Multiple files per (partitioned) table
-------------------------------------- --------------------------------------
+ System uses less filehandles - System uses more filehandles
+ One one fsync per second per table - Possibly many more fsync calls (bottleneck)
(less fs overhead (journal etc)) (more fs overhead)
+ Single file uses less space overall - Much larger disk space usage
- Single file fragments badly + Less fragmentation
- Optimize table (et al) takes longer + You can choose to optimize just one file
- One file = one filesystem + You can put heavy traffic files on a fast fs
(e.g. on a solid state disk)
- Impossible to reclaim disk space + possible to emergency-reclaim disk space
in a hurry (truncate table takes long) fast (just delete a file)
- ALTER TABLE can use large % of disk- + rebuilding with ALTER TABLE will use less
space for temp tables while rebuilding temp disk space
一般来说我会不建议多个文件。
但是,如果您的工作负载导致重碎片和optimize table
需要太长时间,使用多个文件将会有意义。
忘掉回收空间
有些人赚了不少做文章的有关事实,在InnoDB表文件总是增不降,导致浪费的空间,如果行被删除。
然后他们想出了回收该空间的方案,以便不会耗尽可用磁盘空间。 (truncate table x
)。
对于多个文件,这将工作得更快,但所有这些都是无稽之谈,因为数据库几乎总是增长并且(几乎)永远不会缩小,因此所有回收空间将浪费大量时间(CPU和IO)将被完全锁定(不允许读取和不允许写入)。
只有在下个月的数据添加后发现您的90%完整磁盘(回收后为50%)将会达到99%。
然而,当使用ALTER TABLE当心...
考虑以下情形:
- 磁盘是60%满。
- 数据库占用50%,其他文件占用10%。
如果您在任何表上执行alter table
,如果您将所有表放在一个文件中,则磁盘空间不足。
如果你有多个文件,你不应该有问题(除了咖啡因过量的所有等待)。
在给出任何建议之前,你至少可以说你的表有多大以及db表中的表的数量?数据库的总大小? – bas 2012-03-16 19:42:09