首页 > 解决方案 > 位图和图像大小

问题描述

我有两种方法可以将图像存储在我的数据库中。

  1. 在我的 SQL 表中存储为位图:
{
name: "picture1",
ImageBitmap: "25fd73dye80942qfo2579_6306"
}

或者 2. 将它们存储在服务器上的某个位置并将 URL 保存在表中:

{
name: "picture1",
ImageBitmap: "https://myserver.com/imagefolder/picture1.png"
}

在第一种情况下,假设我要检索 100 行并且每个图像都像 1mb。

如果我向这个端点发出一个 http 请求,它会返回 100mb 的数据吗?还是位图的大小不等于图像的大小?

标签: mysqlresthttpsbitmap

解决方案


看起来您数据库中的“位图”是 Base64 编码的。但这是一个猜测。如果使用BLOB 对象代替 TEXT对象,则不必使用 Base64 。

从您的问题很难判断,在第一种情况下,单个请求是否返回所有图像或每个请求仅返回一个。但话虽如此,您在生产中会遇到大小约为 0.1 GiB 的单个响应的问题。不是一个好主意。使用更多请求,每个请求返回的结果要小得多。

恕我直言,您的第一个场景是一个糟糕的主意。为什么?

  1. 每次 Web 浏览器或其他客户端需要图像时,您的 MySQL 服务器都必须将大量数据移动到您的 REST 服务器,而 REST 服务器必须将其传递给您的客户端。那是很大的负担。数据库服务器是扩展系统中的稀缺资源。您不想让他们负担向客户端提供图像所需的所有 SSD 和网络 IO。
  2. 当客户端从服务器上的目录中检索对象时,它会使用基于文件的 Web 服务器。当该 Web 服务器(apache、nginx、lighttpd)收到请求时,它会将文件映射到 RAM 中并将其发送出去。这种风格的服务器已经开发了 25 年了:它们高效且安全,并且易于配置和监控。
  3. 以这种方式检索对象可以扩展以非常容易地利用全球内容交付网络。(Cloudflare?Amazon Cloudfront?如果你有钱,甚至是 Akamai。)
  4. 从基于文件的 Web 服务器提供的图像对象可以利用 http 协议的缓存方面,因此它们不必一遍又一遍地提供给同一个客户端,或者将事件提供给同一个代理。它们是静态的:它们不会在不改变名字的情况下改变。
  5. 与充满 BLOB 的大型数据库表相比,充满文件的目录容易备份和恢复。

推荐阅读