我有1500万个简单的键/值记录。密钥大小都是单个单词,它们包含的值的大小范围从几个字节到10MB不等。
需要经常访问随机密钥。
我认为将这些文件作为文件存储在目录而不是数据库中会更有效率。所以我需要的是一个目录,其中包含文件名作为密钥和文件中的值,而不是拥有包含所有这些条目的海量表。
这意味着如果我想要键azpdk
的值,我只需要在PHP中使用file_get_contents('/my/directory/azpdk')
,而不是使用这样的请求麻烦MySQL。
在我看来这是有道理的,我希望使用文件系统而不是数据库来提高效率。我在这个假设中是否正确?在一个目录中有1500万个文件,这仍然是快速有效的吗?
仅供参考,文件系统是xfs。
答案 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
这有一些不错的功能:
希望有所帮助。
答案 1 :(得分:0)
我在一家基因组学研究中心工作,生物信息系统并不是特别有经验的程序员。
除了使用数据库之外,其中一些数据库会生成数百万个小文件,直到文件系统停止运行。