在 SQL Server 中存储图像?
Posted
技术标签:
【中文标题】在 SQL Server 中存储图像?【英文标题】:Storing images in SQL Server? 【发布时间】:2011-08-02 14:28:08 【问题描述】:我制作了一个小型演示站点,并在其上将图像存储在 sql 服务器的图像列中。我有几个问题是......
这是个坏主意吗?
当它增长时会影响我网站的性能吗?
另一种方法是将图像存储在磁盘上,并且仅将对图像的引用存储在数据库中。这一定是很多人都遇到过的共同困境。我欢迎一些建议,如果可以的话,我真的很乐意少犯错误。
【问题讨论】:
2017年这个问题有什么新的补充吗?这在今天仍然有效吗? 【参考方案1】:微软研究院有一篇非常好的论文,叫做To Blob or Not To Blob。
他们经过大量的性能测试和分析后得出的结论是:
如果您的图片或文档的大小通常低于 256KB,则将它们存储在数据库的 VARBINARY 列中会更有效
1234563 /p>在这两者之间,根据你的使用情况有点折腾
如果您决定将图片放入 SQL Server 表中,我强烈建议您使用单独的表来存储这些图片 - 不要将员工照片存储在员工表中 - 将它们保存在单独的表中。这样一来,Employee 表就可以保持精简、平均和非常高效,假设您并不总是需要选择员工照片作为查询的一部分。
对于文件组,请查看 Files and Filegroup Architecture 了解简介。基本上,您可以从一开始就为大型数据结构创建带有单独文件组的数据库,或者稍后添加一个额外的文件组。我们称之为“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 属性,它们仍处于事务控制之下,并且是数据库的一部分) 很好的答案。如果您想详细解释为什么建议您使用专用表存储图像数据,我有created a separate question for that on dba.SE。【参考方案2】:我曾经陷入这种困境,并在谷歌上进行了相当多的研究以征求意见。我发现确实很多人认为将图像保存到磁盘对于更大的图像更好,而 mysql 允许更轻松地访问,特别是从 php 等语言。
我发现了一个类似的问题
MySQL BLOB vs File for Storing Small PNG Images?
我的最终判断是,对于诸如个人资料图片之类的东西,只是每个用户需要存在的一个小方形图像,mySQL 会比在硬盘中存储一堆拇指要好,而对于相册和类似的东西也就是说,文件夹/图像文件更好。
希望对你有帮助
【讨论】:
【参考方案3】:为什么将图片存储在数据库中而不是网络服务器的目录中会更好。
您创建了一个应用程序,其中存储在服务器上的一个文件夹中的大量图片,客户端已经使用了多年。
现在他们来找你了。他们的服务器已被破坏,他们需要在新服务器上恢复它。他们再也无法访问旧服务器了。他们唯一的备份是数据库备份。
你当然有源,可以简单地将它部署到新服务器,安装 SqlServer 并恢复数据库。但是现在所有的照片都不见了。
如果您已将图片保存在 SqlServer 中,一切都会像以前一样工作。
只要我的 2 美分。
【讨论】:
好点。图像备份与数据库备份一样重要……有时甚至更重要。 文件系统上的图片也需要网络权限。 网络权限是个好点。但我没有看到只有数据库备份的情况。您肯定会备份应用程序和文件。您可以很容易地丢失数据库但拥有文件。【参考方案4】:我希望将图像存储在一个目录中,然后将对该图像文件的引用存储在数据库中。
但是,如果您确实将图像存储在数据库中,则应该对数据库进行分区,以便图像列驻留在单独的文件中。
您可以在此处http://msdn.microsoft.com/en-us/library/ms179316.aspx 阅读有关使用文件组的更多信息。
【讨论】:
【参考方案5】:在 SQL Server 中存储图像时不要使用“图像”数据类型,根据 MS 的说法,它正在被新版本的 SQL Server 中逐步淘汰。改用 varbinary(max)
https://msdn.microsoft.com/en-us/library/ms187993.aspx
【讨论】:
【参考方案6】:虽然性能问题是有效的,但实际上您应该避免将图像存储在数据库中的真正原因是出于数据库管理的原因。您的数据库将快速增长,并且数据库的成本远高于简单的文件存储。数据库备份和恢复比文件备份恢复更昂贵和耗时。在紧要关头,您可以比一个臃肿的图像更快地恢复一个较小的数据库。将 Azure 上的 1 TB 文件存储与 1 TB 数据库进行比较,您会发现成本的巨大差异。
【讨论】:
【参考方案7】:另一个选项于 2012 年发布,称为文件表:https://msdn.microsoft.com/en-us/library/ff929144.aspx
【讨论】:
【参考方案8】:根据我的经验,将存储在另一个位置的图像存储到 url 是简单项目的最佳方式。
【讨论】:
以上是关于在 SQL Server 中存储图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何仅使用 javascript 将图像转换为字节数组以将图像存储在 sql server 上?