在SQL Server中存储图像?


191

我做了一个小型演示站点,并在其上将图像存储在sql服务器上的图像列中。我有几个问题是...

  • 这是一个坏主意吗?

  • 当它增长时,会影响我网站的性能吗?

另一种选择是将映像存储在光盘上,而仅将对映像的引用存储在数据库中。这肯定是许多人遇到的共同难题。我很欢迎提出建议,如果可以的话,我会很乐意减少错误。


5
2017年有没有新增加此问题?到今天仍然有效吗?
Haikal Nashuha

Answers:


270

Microsoft Research的一篇非常好的论文叫做To Blob或Not To Blob

经过大量的性能测试和分析,他们的结论是:

  • 如果您的图片或文档的大小通常小于256KB,则将它们存储在数据库VARBINARY列中会更有效

  • 如果图片或文档的大小通常超过1 MB,则将它们存储在文件系统中的效率更高(并且使用SQL Server 2008的FILESTREAM属性,它们仍处于事务控制之下,并且属于数据库的一部分)

  • 在这两者之间,根据您的使用情况有些不同

如果您决定将图片放入SQL Server表中,我强烈建议使用一个单独的表来存储这些图片-不要将员工照片存储在employee表中-请将它们保存在单独的表中。这样,假设您并不需要总是选择员工的照片作为查询的一部分,那么Employee表就可以保持精简,卑鄙和高效。

对于文件组,请查看“ 文件和文件组体系结构 ”以获取简介。基本上,您可以从一开始就为大型数据结构使用单独的文件组创建数据库,或者稍后再添加其他文件组。我们称之为“ LARGE_DATA”。

现在,只要您有一个新表要创建,该表需要存储VARCHAR(MAX)或VARBINARY(MAX)列,就可以为大数据指定此文件组:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

查看有关文件组的MSDN简介,并试用它!


这是好事还是坏事?...•如果您的图片或文档通常大小超过1 MB,则将它们存储在文件系统中的效率更高(并且使用SQL Server 2008的FILESTREAM属性,它们仍处于事务控制之下和数据库的一部分)
htm11h 2015年

好答案。如果您想详细解释为什么建议使用专用表存储图像数据,我在dba.SE上为此创建了一个单独的问题
Heinzi

15

我曾经陷入这个困境,并在谷歌上研究了很多意见。我发现的确是,很多人确实看到了将映像保存到磁盘以获取较大映像的效果更好,而mySQL允许更轻松地访问,尤其是从PHP之类的语言。

我发现了类似的问题

MySQL BLOB与用于存储小PNG图像的文件?

我的最终结论是,对于个人资料图片之类的东西,每个用户只需要一个小正方形图像,mySQL会比在硬盘中存储一堆大拇指要好,而对于相册和诸如此类的东西,文件夹/ image文件更好。

希望能帮助到你



11

为什么将图片存储在数据库中而不是将图片存储在Web服务器上的目录中为什么很好。

您已经创建了一个应用程序,其中许多图片存储在服务器上的文件夹中,客户端已经使用了多年。

现在他们来找你。他们的服务器已被破坏,需要将其还原到新服务器上。他们再也无法访问旧服务器了。他们仅有的备份是数据库备份。

您当然拥有源代码,可以简单地将其部署到新服务器,安装SqlServer并还原数据库。但是现在所有照片都消失了。

如果已将图片保存在SqlServer中,则所有内容将像以前一样工作。

只是我的2美分。


3
好点子。映像的备份与数据库备份一样重要……有时甚至更重要。
克里斯·卡蒂尼亚尼

此外,文件系统上的映像也需要网络许可。
克里斯·卡蒂尼亚尼

2
网络权限是一个好点。但是我看不到只有数据库备份的情况。您肯定会有应用程序和文件的备份。您可能很容易丢失数据库但拥有文件。
Norbert Norbertson



7

尽管性能问题是有效的,但实际上,出于数据库管理的原因,应避免在数据库中存储映像的真正原因是。您的数据库将非常迅速地增长,并且数据库的成本远远高于简单的文件存储。数据库备份和还原比文件备份还原更加昂贵和耗时。紧要关头,您可以比使用restore肿的映像更快地恢复较小的数据库。将Azure上1 TB的文件存储与1 TB的数据库进行比较,您会发现成本上的巨大差异。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.