位图和图像大小
Bitmap and image size
我有两种方法可以将图像存储在我的数据库中。
- 在我的 SQL table:
中存储为位图
{
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 数量级的单个响应的问题。这不是个好主意。使用更多请求,每个请求返回更小的结果。
恕我直言,您的第一个方案是个糟糕的主意。为什么?
- 每次 Web 浏览器或其他客户端需要图像时,您的 MySQL 服务器必须将大量数据移动到您的 REST 服务器,REST 服务器必须将其传递给您的客户端.这是一个很大的负担。数据库服务器是扩展系统中的稀缺资源。您不想让他们承担向客户端传送图像所需的所有 SSD 和网络 IO。
- 当客户端从服务器上的目录检索对象时,它会使用 file-based 网络服务器。当该 Web 服务器(apache、nginx、lighttpd)收到请求时,它将文件映射到 RAM 中并将其发送出去。这种类型的服务器现在已经开发了 quarter-century:它们高效且安全,并且易于配置和监控。
- 以这种方式检索对象可以扩大规模,从而真正 轻松利用全球内容分发网络。 (Cloudflare?Amazon Cloudfront?如果你有钱,甚至是 Akamai。)
- 您的图像对象由 file-based 网络服务器提供,可以利用 http 协议的缓存方面,因此它们不必一次又一次地提供给同一个客户端,或事件到同一个代理。它们是静态的:它们不会随着名称的改变而改变。
- 与充满 BLOB 的大型数据库表相比,充满文件的目录 更容易备份和恢复。
直接回答您的问题:
您的位图数据是 base64 编码的。 base64 的工作方式是将三个 8 位二进制字节编码为四个 6 位 base64 数字,因此这些数字可以用可打印的 ASCII 字符表示。
这意味着 base64 编码数据恰好是等效二进制数据大小的 4/3。它比它编码的二进制数据大。
我有两种方法可以将图像存储在我的数据库中。
- 在我的 SQL table: 中存储为位图
{
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 数量级的单个响应的问题。这不是个好主意。使用更多请求,每个请求返回更小的结果。
恕我直言,您的第一个方案是个糟糕的主意。为什么?
- 每次 Web 浏览器或其他客户端需要图像时,您的 MySQL 服务器必须将大量数据移动到您的 REST 服务器,REST 服务器必须将其传递给您的客户端.这是一个很大的负担。数据库服务器是扩展系统中的稀缺资源。您不想让他们承担向客户端传送图像所需的所有 SSD 和网络 IO。
- 当客户端从服务器上的目录检索对象时,它会使用 file-based 网络服务器。当该 Web 服务器(apache、nginx、lighttpd)收到请求时,它将文件映射到 RAM 中并将其发送出去。这种类型的服务器现在已经开发了 quarter-century:它们高效且安全,并且易于配置和监控。
- 以这种方式检索对象可以扩大规模,从而真正 轻松利用全球内容分发网络。 (Cloudflare?Amazon Cloudfront?如果你有钱,甚至是 Akamai。)
- 您的图像对象由 file-based 网络服务器提供,可以利用 http 协议的缓存方面,因此它们不必一次又一次地提供给同一个客户端,或事件到同一个代理。它们是静态的:它们不会随着名称的改变而改变。
- 与充满 BLOB 的大型数据库表相比,充满文件的目录 更容易备份和恢复。
直接回答您的问题:
您的位图数据是 base64 编码的。 base64 的工作方式是将三个 8 位二进制字节编码为四个 6 位 base64 数字,因此这些数字可以用可打印的 ASCII 字符表示。
这意味着 base64 编码数据恰好是等效二进制数据大小的 4/3。它比它编码的二进制数据大。