我在一个目录中有一个包含超过100k个静态文件的站点(600k + dirs和总共文件)。我想我可以在没有inode问题的情况下获得VPS来托管它,但它不会是一个高流量站点,所以我宁愿使用廉价的虚拟主机。
我正在考虑将文件存储在由URL路径索引的MySQL表中,并通过PHP提供服务。有更好的方法吗?
编辑:为了澄清,这与在数据库中存储图像不同。我在谈论HTML页面。
答案 0 :(得分:1)
我认为您最好的方法不是将它们存储在数据库中。在存储和提供文件方面,这就是文件系统最擅长的。没有可能的原因,数据库可以比普通文件系统更有效地执行此操作。
如果你要将它们存储在数据库中,那么给定大小限制你需要使用BLOB字段(例如TEXT),并且为了效率散列URL并将其存储在列中而不是将一些巨大的VARCHAR字段编入索引。
但是,正如你所说的那样它们是静态的,这里没有任何意义 - 因为它们是静态的,你的网络服务器会在页面中添加一些长的缓存标题,这样它们就会被存储在本地,以便将来点击它们客户端。
[编辑1 - 回应评论]
我用所提供的信息回答了这个问题,并且在OP未提供信息的情况下保持通用性。
这取决于您索引的VARCHAR的大小 - 这与您要编制索引的数据存储长度(URL /路径/页面名称)有关。
如果你只为不到10万行索引少于约45个字符,我猜它真的不会有太大的区别,一个哈希会使用更少的内存但是一个小集的大小和性能可能不会真的那么多差。
当OP询问数据库时我回答了这个问题,但仍然看不出你为什么要把它们放在那里的任何原因 - 它会比使用文件系统慢。为什么要连接到数据库处理网络性能(除非它们位于同一个盒子上 - 不太可能在Web主机中)查询索引,获取行,通过数据库提供程序运行该数据并在Web服务器执行相同操作时将输出流式传输到响应流结果是CPU周期少得多,与数据库相比只占内存使用量的一小部分?
答案 1 :(得分:0)
是 - 文件系统是数据库。我在过去10年中遇到的所有文件系统都可以很容易地在目录中容纳这么多文件 - 目录实现为树(有些使用B树 - 但是有更大扇出的结构,如H-Trees为这种应用更好地工作)。
(实际上,考虑到coice,我建议将其构建为目录层次结构 - 例如,使用dirs作为文件名的前2个字母或内容的md5哈希 - 它可以使内容管理变得更容易妥协表现。)
关系数据库都是关于存储小块结构化数据 - 它们不是管理大型可变大小数据的有效方法。
我没有任何基准,但正如我选择一辆旅行车通过运动摩托车快速移动数PB的数据一样,我会使用合适的文件系统(例如BTRFS或Ext4 - ZFS)我也会做这项工作,但除了Solaris之外,它不是一个好的选择 - 而且对于网络服务器而言,solaris是否有意义是值得怀疑的。
问题是廉价的托管公司很少提前提供这种级别的信息。
请注意,文件系统行为的大小调整可能会导致性能大幅下降 - 在您的情况下,如果在Linux上运行,我建议显着减少vfs_cache_pressure。但这需要root访问权限。
另一种方法是使用文档数据库而不是关系数据库(不是键/值存储)。这些是一种Schema free(NoSQL)数据库,旨在提供大型数据结构的快速复制和处理。因此,这将提供更具可扩展性的解决方案(如果这是一个问题)。例如RavenDB。您可以使用键/值存储,但这些很少被优化以处理大型数据有效负载。
如果你有一个非常强大的理由其他而不是你在这里描述的话,我只考虑MySQL。