2012-03-16 53 views
4

分区大型表时,我可以选择将标志-innodb_file_per_table设置为TRUE或FALSE。 True会创建许多文件(每个分区一个),并大大增加我的磁盘使用量,但允许我将分区分散到不同的卷上(我不打算这么做)。 FALSE会将表格保存为一个大文件。假设我将所有文件保留在同一个逻辑卷上,我能期待这两个选项之间的任何显着的查询性能差异吗?或者更一般地说,在除了磁盘使用和管理之外的两个选项之间进行选择时,是否有任何问题需要考虑?mySQL分区多文件与单文件性能?

一些统计:

  • 表的总数:20(只有少数几个我感兴趣的paritioning - 看到我的其他question
  • 最大的表有100M的记录。
  • 总分贝大小约为60G。
+0

在给出任何建议之前,你至少可以说你的表有多大以及db表中的表的数量?数据库的总大小? – bas 2012-03-16 19:42:09

回答

7

正如您已经指出-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,如果您将所有表放在一个文件中,则磁盘空间不足。
如果你有多个文件,你不应该有问题(除了咖啡因过量的所有等待)。

+0

再次感谢您。我特意询问了关于查询性能(我对SELECT和UPDATE查询特别感兴趣)。你有关于这个话题的猜测或想法吗?我打算列出分区(http://dev.mysql.com/doc/refman/5.1/en/partitioning-list.html),并对每个查询的数千条记录做了大量的SELECT和UPDATES,但它们始终处于打开状态一个或另一个列表分离的分区。 – Paul 2012-03-19 01:44:15