将图像文件存储在Mongo数据库中,这是一个好主意吗?

时间:2011-10-09 13:37:24

标签: mysql mongodb file database

使用mysql时,将图像作为BLOB存储在数据库中是一个坏主意,因为它会使数据库非常大,这对正常使用数据库是有害的。然后,最好将图像文件保存在磁盘上,并在数据库中保存链接。

但是,我认为这与MongoDB不同,因为增加数据库文件大小对性能的影响可以忽略不计(这就是MongoDB可以成功处理数十亿条记录的原因)。

您认为最好将图像文件保存在MongoDB(作为GridFS)以减少存储在服务器上的文件数量;或者最好保持数据库尽可能小?

4 个答案:

答案 0 :(得分:13)

问题不在于数据库变大,数据库可以解决这个问题(尽管MongoDB在这方面不如其他许多人好)。问题是,要将数据发送到客户端,它首先必须由数据库移动到RAM中,然后复制到应用程序的内存中,然后传递给内核以通过套接字发送。它浪费了大量的RAM和CPU周期。在文件系统中拥有大文件最好的原因是它可以更容易地复制它,你可以要求内核直接将文件从磁盘流式传输到套接字。

在文件系统中存储大文件的缺点是分发起来要困难得多。使用数据库和Mongo的GridFS之类的东西可以扩展。您只需要确保不要立即将整个文件复制到应用程序的内存中,而是一次复制一个块。现在,大多数Web应用程序框架都支持发送分块HTTP响应。

答案 1 :(得分:7)

答案是肯定的。回到旧洞穴时代,服务器具有可更改的可变文件系统。在我们尝试扩展事物之前,这很棒。

Cave-people现在用immutable deployments构建应用程序。 HerokuDokku就是一个例子。由于Web应用程序服务器没有状态,因此可以轻松地创建,升级,扩展和销毁它们。

由于我们还有文件,我们需要将它们放在某处。有几种解决方案:nfs,我们的数据库,别人数据库。

  • nfs是一个'网络文件系统',你可以在网络资源上进行文件i / o。如果你正在处理网络,恕我直言,除非你已经知道,否则它不会增加太多价值。

  • 我们的数据库 - 对于MongoDB there are two options :(文件> 16mb)? GridFS:BinData

  • 有人使用数据库 - 有些是基本的,如Amazon S3,有些提供额外的服务,如Cloudinary或Dropbox。

如果你是一个大预算的企业团队,而且每周花40小时照顾服务器,那么肯定 - 使用文件系统。如果您正在构建可扩展的Web应用程序,那么将文件放入数据库是有意义的。

如果你担心表现:

1)使用代理(例如nginx)或CDN为客户托管您的内容。您的服务器应该只是服务缓存未命中。

2)使用流式传输IO Nodeschool has a cool tutorial for Node.js

答案 2 :(得分:2)

MongoDB的GridFS专为此类存储而设计,非常便于以任何服务器都可以使用它们的方式将图像文件存储在许多不同的服务器上。

答案 3 :(得分:0)

在任何数据库中存储图像都不是一个好主意,因为:

  
      
  • 对数据库的读/写总是慢于文件系统
  •   
  • 您的数据库备份变得庞大且耗时更长
  •   
  • 现在需要通过您的应用和数据库图层访问文件
  •   
     

最后两个是真正的杀手。

来源:Three things you should never put in your database

因此,如果您可以使您的应用程序变得狡猾,那么最好不要将图片上传到 MongoDB

然而,如果你接近截止日期......并且数据库将会很小,以至于它不会长大,而且它的大小永远不会超过运行你的应用程序的机器上的可用内存,那么我认为(如与引用文章的作者相反,您可以考虑将图像存储在 MongoDB 中。它简单,方便,快速实施,并为您提供一些灵活性。