问题 上传和下载图像到MongoDB比在磁盘上更快


假设我们想开发一个照片网站。

从MongoDB上传或下载图像比从磁盘存储或下载图像更快......因为mongoDB可以将图像和文件保存在块中并保存元数据。

因此,对于照片共享网站,将图像存储在mongodb或典型的服务器硬盘上会更好(更快)。等等

我正在考虑使用php,codeigniter顺便说一句,如果这改变了有关问题的性能问题。


2321
2018-06-29 21:05


起源

将文件存储在文件系统中,将详细信息存储在db中
将图像存储在数据库中很少是一个好主意,除了一些小的“可移植性”加。现在,每当有人想要查看图像时,您都需要点击数据库。 - Marc B
你做的越多,所需的时间就越长。如果文件在磁盘上,则Web服务器可以直接提供服务,甚至不用分支脚本。如果它在db中,webserver需要fork一个脚本,脚本需要连接到db服务器,db server需要处理查询,脚本需要读取db服务器的答案并处理它以最终传递数据。还在想什么需要更长的时间? - hakre
“更快”并不总是“更好”还有更多要考虑到这些评论没有解决。长期管理文件(文件系统可能是一个巨大的痛苦)备份,复制,文件的元数据(以及像md5哈希MongoDB这样的东西,你可以避免重复)等等。许多网站在数据库中使用图像并且工作得很好...... GridFS的设计正是为了做到这一点! - Justin Jenkins


答案:


轻量级Web服务器(lighttpd,nginx)可以很好地为文件系统中的内容提供服务。由于OS充当缓存层,因此它们通常从内存中提供内容 非常 快速。

如果你想从mongodb提供图像,web服务器必须运行某种脚本(python,php,ruby ...当然是FCGI,你不能为每个图像启动一个新的进程),这必须从中获取数据每次请求图像时都要使用mongodb。那会慢吗?如果使用副本集,则可以实现自动复制和故障转移。如果你需要这个并且聪明到足以知道使用FS实现它,那么选择那个选项...如果你需要一个非常快速的实现,那么mongodb可能是一个更快的方法。但是,如果您的网站迟早会受欢迎,您必须切换到FS实施。

顺便说一句:您可以混合使用这两种方法,将图像存储在mongodb中以获得即时可靠性,然后将其复制到几台服务器的FS以获得速度。

一些测试结果

哦,还有一件事......将元数据与图像耦合似乎很好,直到你意识到生成的HTML和图像下载将是两个单独的HTTP请求,因此你必须两次查询mongo,一次查询元数据,一次查询图片。


8
2018-06-29 22:06



“但是,如果您的网站迟早会受欢迎,您必须切换到FS实施。” - 不。 - Moshe Revah
@Zippoxer:我想这取决于你对'流行'的意思。 coffeepowered.net/2010/02/17/serving-files-out-of-gridfs 通过PHP为25k访问者运行图像可能没问题,有点慢,但可以接受..现在如果你有10M或更多用户,那就完全不同了。 - Karoly Horvath


何时使用GridFS存储MongoDB文件  - 文件建议你应该。听起来也是 快速可靠,非常适合备份和复制。希望有所帮助。


3
2018-06-29 21:15



该文件需要一些严肃的更新 - Karoly Horvath


几个基准测试表明,与使用常规旧文件系统相比,MongoDB的文件存储速度(通过GridFS)大约慢6倍。 (一个比较了apache,nginx和mongo)

但是,有充分的理由使用MongoDB进行文件存储,尽管速度较慢 - 来自Mongo的内置分片/复制的#1免费备份。这是一个巨大的节省时间。 #2易于管理,存储元数据,不必担心目录,权限等。也是一个巨大的节省时间。

我们的照片后端几年前就已经实现了一个巨大的意大利面条代码,它做了各种各样的事情(检查或创建用户目录,检查或创建日期目录,检查名称冲突,设置烫发),以及其他一切混乱备份。

我们最近把一切都变成了Mongo。根据我们的经验,Mongo有点慢(它可能慢6倍,但感觉不像慢6倍),无论如何 - 那又怎么样?所有的意大利面都在窗外,新的Mongo +照片代码更小,更紧凑,逻辑更简单。永远不要回到文件系统。

http://www.lightcubesolutions.com/blog/?p=209


3
2018-02-15 10:53



网站上的流量是多少? - Your Common Sense


你绝对不想直接从MongoDB下载图像。即使通过GridFS,也会比从磁盘上的简单文件慢一点。您也不应该想要从磁盘上执行此操作。这两种选择都不适合以高吞吐量提供图像内容。您始终需要服务器端缓存层,用于源/源(无论是mongo还是文件系统)与用户之间的静态内容。

那么你可以自由选择最适合自己的东西,MongoDB的GridFS提供了一些免费的功能,当你直接使用文件时,你必须自己做。


2
2018-06-29 21:47



文件系统和用户之间有几层缓存。最重要的是浏览器的缓存,代理和操作系统。 - Karoly Horvath