mysql - 位图和图像大小
问题描述
我有两种方法可以将图像存储在我的数据库中。
- 在我的 SQL 表中存储为位图:
{
name: "picture1",
ImageBitmap: "25fd73dye80942qfo2579_6306"
}
或者 2. 将它们存储在服务器上的某个位置并将 URL 保存在表中:
{
name: "picture1",
ImageBitmap: "https://myserver.com/imagefolder/picture1.png"
}
在第一种情况下,假设我要检索 100 行并且每个图像都像 1mb。
如果我向这个端点发出一个 http 请求,它会返回 100mb 的数据吗?还是位图的大小不等于图像的大小?
解决方案
看起来您数据库中的“位图”是 Base64 编码的。但这是一个猜测。如果使用BLOB 对象代替 TEXT对象,则不必使用 Base64 。
从您的问题很难判断,在第一种情况下,单个请求是否返回所有图像或每个请求仅返回一个。但话虽如此,您在生产中会遇到大小约为 0.1 GiB 的单个响应的问题。不是一个好主意。使用更多请求,每个请求返回的结果要小得多。
恕我直言,您的第一个场景是一个糟糕的主意。为什么?
- 每次 Web 浏览器或其他客户端需要图像时,您的 MySQL 服务器都必须将大量数据移动到您的 REST 服务器,而 REST 服务器必须将其传递给您的客户端。那是很大的负担。数据库服务器是扩展系统中的稀缺资源。您不想让他们负担向客户端提供图像所需的所有 SSD 和网络 IO。
- 当客户端从服务器上的目录中检索对象时,它会使用基于文件的 Web 服务器。当该 Web 服务器(apache、nginx、lighttpd)收到请求时,它会将文件映射到 RAM 中并将其发送出去。这种风格的服务器已经开发了 25 年了:它们高效且安全,并且易于配置和监控。
- 以这种方式检索对象可以扩展以非常容易地利用全球内容交付网络。(Cloudflare?Amazon Cloudfront?如果你有钱,甚至是 Akamai。)
- 从基于文件的 Web 服务器提供的图像对象可以利用 http 协议的缓存方面,因此它们不必一遍又一遍地提供给同一个客户端,或者将事件提供给同一个代理。它们是静态的:它们不会在不改变名字的情况下改变。
- 与充满 BLOB 的大型数据库表相比,充满文件的目录更容易备份和恢复。
推荐阅读
- python - 在两个单独的 Heroku 应用程序上代理从 React 前端到 Flask 后端的 API 请求
- python - Atom 在 macOS 上将 Python 2.7 优先于 Python 3.7
- pervasive - Pervasive Database 有调度程序吗?
- google-cloud-speech - google-cloud-speech - 如何向 Google 提供法语成绩单的反馈
- mysql - 如何按顺序执行一系列 SQL 命令?
- python - 用自己的方法诅咒菜单模块
- java - 在对象内添加字符串数组
- excel - 如何在 Excel 中使用 VBA 刷新和保存/打印到 PDF?
- php - 如果 file_get_contents 返回“HTTP 请求失败!HTTP/1.1 403”是什么意思?
- javascript - 如何在开发人员模式浏览器(检查)中将数据发送到服务器而不显示它?