【发布时间】:2010-11-23 18:20:59
【问题描述】:
当您保存图像时(假设您有很多图像),您是在数据库中存储为 blob 还是文件?为什么?
【问题讨论】:
标签: database performance image blob
当您保存图像时(假设您有很多图像),您是在数据库中存储为 blob 还是文件?为什么?
【问题讨论】:
标签: database performance image blob
我通常将它们存储为文件,并将路径存储在数据库中。对我来说,这是一种比将它们作为 blob 推入数据库更容易、更自然的方法。
将它们存储在数据库中的一个论点是:进行完整备份要容易得多,但这取决于您的需要。如果您需要能够轻松地获取数据库(包括图像)的完整快照,那么将它们作为 blob 存储在数据库中可能是可行的方法。否则,您必须将数据库备份与文件备份配对,并以某种方式尝试将两者关联起来,这样如果您必须进行恢复,您就知道要恢复哪对。
【讨论】:
如果我在一台 Web 服务器上运行并且只会在一台 Web 服务器上运行,我会将它们存储为文件。如果我在多个 webheads 上运行,我将图像的引用实例放入数据库 BLOB 并将其作为文件缓存在 webheads 上。
【讨论】:
这取决于图像的大小。
微软研究院对此主题有一个interesting document
【讨论】:
Blob 在 db/scripts 上可能很重,为什么不只存储路径。我们使用 blob 的唯一原因是它是否需要合并复制或资产的超严格安全性(例如除非登录或其他情况,否则无法提取图像)
【讨论】:
鉴于您可能希望将图像连同名称、简要说明、创建日期、创建者等一起保存,您可能会发现保存在数据库中会更好。这样,一切都在一起了。如果您保存了相同的信息并将图像存储为文件,您将不得不从两个地方检索整个“图像对象”......并且在路上,您可能会发现自己遇到同步问题(找不到某些图像) .希望这是有道理的。
【讨论】:
保存是指使用它们在网页或类似内容中显示? 如果是这种情况,更好的选择是使用文件,如果您使用数据库,它将不断受到照片请求的影响。而且这种情况不能很好地扩展。
【讨论】:
我尝试使用 db(SQL Server 和 MySQL)来存储中等(
1) 一些 DB (SQL Server Express) 有大小限制;
2) 一些数据库(MySQL)变得非常缓慢;
3)当你必须显示一个对象列表时,如果你不小心做了SELECT * FROM table,大量的数据会尝试从db中上下,导致响应缓慢或内存失败;
4) 一些前端(ruby ActiveRecord)在处理 blob 时遇到了很大的麻烦。
只使用文件。不要将它们全部存储在同一个目录中,使用一些技术将它们放在多个目录中(例如,您可以使用 GUID 的最后两个字符或 int id 的最后两个数字),然后将路径存储在 db 中。
【讨论】:
SELECT * FROM table 上卖给了我——我定期使用它进行测试,仅此一项就可能让我非常头疼。文件给我!
问题是,您的应用程序是否像处理其他应用程序数据一样处理 BLOBS 或其他文件?您的用户是否将图像与其他数据一起上传?如果是这样,那么您应该将 BLOB 存储在数据库中。它可以更轻松地备份数据库,并在出现问题时恢复到事务一致的状态。
但是,如果您指的是属于应用程序基础结构而不是用户数据的图像,那么答案可能是,不。
【讨论】:
对数据库服务器的性能影响是一个没有实际意义的问题。如果您需要文件系统的性能优势,您只需在第一次请求时将其缓存在那里。然后可以通过直接链接直接从文件系统提供后续请求(对于 Web 应用程序,您可以在刷新输出缓冲区之前重写 HTML)。
这提供了两全其美:
对于不会一直改变的东西,不需要不断地锤击数据库,但重要的是用户数据都在那里,而不是分散在不同的地方,使得多服务器操作和部署成为一个完全一团糟。 我一直提倡“数据库作为用户数据存储,除非”方法,因为它在架构上更好,并且在有效缓存时不一定更慢。
话虽如此,使用文件系统作为权威存储的一个很好的理由是当您确实需要使用外部独立工具来访问它时,例如SFTP 之类的。
【讨论】:
使用文件系统更好,因为在将图像存储为 blob 时将提供的基本功能是 1. 图像不需要的可变性,因为我们不会更改图像的二进制数据,我们将只删除整个图像 2. 索引搜索:图片不需要索引,因为图片的内容不能被索引,索引搜索搜索的是BLOB的内容。
在这里使用文件系统是有益的,因为 1.它更便宜 2. 使用CDN快速访问
因此一种方法是将图像存储为文件并在数据库中提供其路径
【讨论】:
我建议选择文件系统。首先,让我们讨论一下为什么不是 Blob?因此,要回答这个问题,我们需要思考 DB 相对于文件系统为我们提供了哪些优势?
那为什么是文件系统?
select *) 将导致查询的性能非常差,因为大量的数据将进出数据库。相反,如果我们只是将图像的 URL 存储在 DB 中,并将图像存储在分布式文件系统 (DFS) 中,它会快得多。【讨论】: