使用文件系统作为15M文件的数据库 - 它是否有效?

时间:2014-05-01 19:15:41

标签: database filesystems xfs

我有1500万个简单的键/值记录。密钥大小都是单个单词,它们包含的值的大小范围从几个字节到10MB不等。

需要经常访问随机密钥。

我认为将这些文件作为文件存储在目录而不是数据库中会更有效率。所以我需要的是一个目录,其中包含文件名作为密钥和文件中的值,而不是拥有包含所有这些条目的海量表。

这意味着如果我想要键azpdk的值,我只需要在PHP中使用file_get_contents('/my/directory/azpdk'),而不是使用这样的请求麻烦MySQL。

在我看来这是有道理的,我希望使用文件系统而不是数据库来提高效率。我在这个假设中是否正确?在一个目录中有1500万个文件,这仍然是快速有效的吗?

仅供参考,文件系统是xfs。

2 个答案:

答案 0 :(得分:2)

您可能希望查看数据库(不一定是MySQL)而不是文件系统这样的事情有几个原因:

一个目录中的更多文件会降低速度

虽然XFS应该非常聪明地分配资源,但是大多数文件系统在单个目录中拥有的文件越多,性能就越差。在命令行上处理它们也很令人头疼。看看这个(http://oss.sgi.com/projects/xfs/datasheet.pdf),那里有关于查找的图表,每个目录只有50k,而且它正在向下。

<强>开销

每个文件都有一定数量的文件系统开销。如果您有许多小文件,您可能会发现最终商店因此而膨胀。

密钥清理

你的所有单词都安全放入文件名吗?你确定吗?那里的一两条斜线确实会破坏你的一天。

NoSQL可能是一个不错的选择

像MongoDB / Redis这样的东西可能是一个不错的选择。 MongoDB可以存储高达16mb的单个文档,并且在将文件放在文件系统上时使用起来并不困难。如果您要存储15mb的文档,那么您可能会在这个限制上过于接近,但还有其他选择。

关于这一点的好处是,查找性能可能非常好,如果您以后发现它不能通过创建集群等来扩展性能。任何这样的系统都将还可以很好地管理磁盘上的文件,以获得良好的性能。

如果您打算使用磁盘

考虑使用要存储的单词的MD5哈希值,并将文件名基于此。例如,azpdk的MD5是:

1c58fb66d5a4d6a1ebe5ec9e217fbbf9

您可以使用它来创建文件名,例如:

my_directory/1c5/8fb/66d5a4d6a1ebe5ec9e217fbbf9

这有一些不错的功能:

  • 哈希处理可怕的角色
  • 目录分散数据,因此没有目录有超过4096个条目
  • 这意味着查找性能应该相对不错

希望有所帮助。

答案 1 :(得分:0)

我在一家基因组学研究中心工作,生物信息系统并不是特别有经验的程序员。

除了使用数据库之外,其中一些数据库会生成数百万个小文件,直到文件系统停止运行。