在MySQL中将小图像存储为Blob数据

时间:2018-10-11 15:41:06

标签: mysql blob

几年前,我读到有关在表中存储Blob数据的想法,并认为为博客文章存储图像是一个绝妙的主意,但是在阅读了有关它对页面运行时间影响的负面观点之后,我被驳回了它。

我最终创建了一个用于blob的php上传系统,查看了我上传的几张图像的数据之后,我看到了越来越多的图像最终最终会导致问题的原因。

但是,上传小图片(120px x 120px)在Blob数据单元中产生的字符数量非常少,与我为网站新闻提要撰写的短篇新闻大致相同。

那么,如何处理Blob数据?它真的会降低数据库性能吗?它会变成什么样的大小?我想为每个帖子生成120 x 120的缩略图,但是并不想特别上传物理文件。

1 个答案:

答案 0 :(得分:0)

将图像保留在dbms中的原因(无论大小如何),不是因为图像检索本身特别会使数据库变慢。相反,这是因为它使您的数据库和Web应用程序执行了额外的,不必要的工作。

当用户请求图像时,您的Web应用程序(PHP或任何语言)必须使用SELECT从数据库中检索信息,然后将其发送到用户的浏览器。对于Web应用程序和数据库,这是额外的工作。如果您发送的页面上包含五张图片,则您的Web应用将必须处理来自浏览器的六个请求,而不是一个。 这是减速的原因。

通常,带有图像的网页在浏览器中具有如下所示的HTML:

 <p>blah blah blah</p>
 <div><img src="/images/thumbnails/0045.jpg" width="120" height="120" /></div>
  (etc)

您的网络应用程序收到请求,并组装并交付html页面。 Web浏览器将解析页面,进行呈现并找到所有<img />标签。然后,浏览器针对找到的每个图像向您的Web应用发出另一个请求。要处理这些图像请求,您的Web应用必须为每个图像处理来自浏览器的单独请求。在处理每个请求时,您的代码必须随后发出另一个SELECT请求,从dbms接收请求的图像,并将其发送到浏览器。

因此,您执行的用于传递页面的SELECT不需要图像Blob,并且无法使用它。您用于检索图像的SELECT可能无法使用包含html内容的列。

对网络应用程序的那些额外请求是由于将图像存储在表中而引起的问题。 (此外,包括MySQL在内的大多数dbms系统都必须做一些额外的工作才能获取BLOB。)

而且,您的Web应用程序必须处理标头以控制缓存,内容类型等。这是额外的编程和测试负担。

图像,甚至缩略图,都是静态的。诸如apache和nginx之类的Web服务器经过了优化,可以直接从服务器的文件系统将其交付给浏览器。 (服务器对文件进行内存映射,然后通过一个send调用将该内存写入出站HTTP套接字。)而且,如果您的应用程序扩展了规模,则可以使用内容交付网络(例如Cloudflare)来交付静态图片快速地吸引到大量用户。

您确实需要管理文件系统中的图像,并告诉Web服务器从何处获取图像。您阅读的有关图像和数据库的材料对此有多种建议。

如果您内容的某些页面上没有更改缩略图,则可以考虑将图像直接嵌入页面的html using data urls中。