存储图片:数据库还是文件系统?

15

我看到了一些相关的文章,但仍然不明白在我的情况下什么是最好的解决方案。

我正在开始编写一个新的Web应用程序,后端将提供大约1-10百万张图片(每个图片的平均大小为200-500KB

我的网站将同时为100-1000位用户提供内容和图片。

我希望尽可能降低提供商成本(但这是次要的要求)。与数据库大小的成本相比,我认为文件系统空间的成本更低。

个人而言,我喜欢将所有图片都存储在数据库中的想法,但我真的很感谢任何建议:)

您认为在我的情况下采用数据库方法是正确的选择吗?


以最高效的方式将20兆字节文件存储在SQL Server 2005图像列中。 - andrewWinn
2
重复?我正在使用Java、MySQL和图像文件,它们的大小为10MB的1/20-1/50。我的问题与特定技术无关,而是与需要存储的图像的大小/数量有关。 - mickthompson
7个回答

22

将所有这些图片放入数据库中会使数据库变得非常大。这意味着您的数据库引擎将忙于缓存所有这些图像(这不是其真正设计的任务),而它本可以缓存热门应用程序数据。

把文件缓存留给操作系统和/或反向代理 - 它们会更擅长处理。


边缘服务器应该为您完成此操作,如果您有能力进行扩展。边缘服务器将从HTTP流量中运行,因此对于它来说,图像来自哪里并不重要,除了初始请求和在超时后发生的一部分请求。考虑到这一点,最好以这样的方式构建数据库层,以便它可以在不访问保存“整个”图像的记录的情况下响应HEAD请求的正确信息。磁盘通常更快,但选择数据库并不意味着您必须放弃所有性能。 - Edwin Buck

15

存储图像文件在文件系统中的其他原因:

  • 即使数据库繁忙或出现故障,图像服务器也可以继续运行。
  • 文件系统专门用于存储文件,效率相当高。
  • 将数据存储在数据库中会导致备份和其他操作变慢。
  • 提供图像服务无需服务器端编码,只需使用普通的IIS/Apache。
  • 您可以使用价格便宜的Web服务器快速扩展,或者可能使用CDN扩展。
  • 您可以在不涉及数据库的情况下执行相关工作(生成缩略图等)。
  • 如果将图像文件缓存在内存中,数据库服务器可以将更多的“真实”表数据保留在内存中,这是进行查询时获得数据库速度的地方。如果使用宝贵的内存来缓存图像文件,与将更多的照片索引存储在内存中相比,几乎没有任何速度优势。

11

5
处理二进制对象时,采用以文档为中心的架构方法,不要将类似PDF和图像等文档存储在数据库中。当您开始看到数据库性能问题时,最终必须将其重构出来。只需将文件存储在文件系统中,并在数据库的一个表中存储路径即可。此外,对于将要序列化和保存在数据库中的数据类型大小,存在物理限制。只需将其存储在文件系统中并访问它。

1
这个问题在SO上每天都被问到。 - Srikar Doddi

4
您的第一句话说明您已经阅读了一些关于这个主题的帖子,因此我不会费心提供覆盖此内容的文章链接。根据我的经验以及您发布的图像数量和图像大小,如果您将它们存储在数据库中,将会严重影响数据库性能。我建议将它们存储在文件系统中。

3
你们使用的是什么数据库?MS SQL Server 2008提供了FILESTREAM存储,可以通过SQL Server 2008和NTFS文件系统的组合来存储BLOB数据并实现高效访问。它涵盖了BLOB存储的选择、为使用FILESTREAM数据配置Windows和SQL Server的方法、将FILESTREAM与其他功能相结合的注意事项以及分区和性能等实现细节。详情

0

我们使用FileNet,这是一个专为图像优化的服务器。它非常昂贵。一个更便宜的解决方案是使用文件服务器。

请不要考虑在数据库服务器上存储大文件。

正如其他人所提到的,将大文件的引用存储在数据库中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接