位图和图像大小

Bitmap and image size

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

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

或者 2. 将它们存储在服务器的某处,并将 URL 保留在 table 中:

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

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

如果我向此端点发出 http 请求,它会 return 100mb 数据吗?或者位图的大小不等于图像的大小?

您数据库中的“位图”似乎是 Base64 编码的。但这是一个猜测。如果您使用 BLOB objects in place of TEXT 个对象,则不必使用 Base64。

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

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

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

直接回答您的问题:

您的位图数据是 base64 编码的。 base64 的工作方式是将三个 8 位二进制字节编码为四个 6 位 base64 数字,因此这些数字可以用可打印的 ASCII 字符表示。

这意味着 base64 编码数据恰好是等效二进制数据大小的 4/3。它比它编码的二进制数据大。