在数据库中,**BLOB(Binary Large Object)**通常用于存储图片、音频、视频、文档等二进制数据。直接存储原始大文件会占用大量空间并影响性能,因此“压缩 BLOB 数据”是常见的优化手段。
下面从压缩思路、实现方式、常见算法、注意事项几个方面说明。
在写入数据库前,由程序对二进制数据进行压缩;读取时再解压。
流程:
原始数据 → 压缩算法 → 压缩后 BLOB → 存入数据库
数据库 → 读取 BLOB → 解压 → 原始数据
优点
缺点
一些数据库支持 BLOB 或表级压缩:
COMPRESS() 函数优点
缺点
将文件存到对象存储(OSS / S3 / 文件系统),数据库只存路径或 URL。
优点
缺点
| 算法 | 特点 | 适用场景 |
|---|---|---|
| GZIP | 通用、压缩率高 | 文本、文档 |
| ZLIB | 比 GZIP 轻量 | 通用 |
| Snappy | 速度快、压缩率一般 | 高频读写 |
| LZ4 | 极快 | 实时系统 |
| Brotli | 高压缩率 | Web 场景 |
对图片/视频本身已压缩的数据,再压缩效果有限。
byte[] data = Files.readAllBytes(Paths.get("file.bin"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (GZIPOutputStream gos = new GZIPOutputStream(baos)) {
gos.write(data);
}
byte[] compressed = baos.toByteArray();
// 存入 BLOB
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO files(data) VALUES(?)");
ps.setBytes(1, compressed);
ps.executeUpdate();
ResultSet rs = stmt.executeQuery(
"SELECT data FROM files WHERE id=1");
rs.next();
byte[] compressed = rs.getBytes("data");
ByteArrayInputStream bais = new ByteArrayInputStream(compressed);
try (GZIPInputStream gis = new GZIPInputStream(bais)) {
byte[] data = gis.readAllBytes();
}
compressed_type VARCHAR(10)
如果你能告诉我:
我可以给你更具体的压缩方案或 SQL 示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。