如何在PostgreSQL13和以下版本中使用lz4压缩文本和二进制数据
从PG14开始,PostgreSQL已经支持LZ4 压缩功能。而PG14之前的版本,其TOAST仅支持一个压缩算法PGLZ(PG内置算法)。众所周知,LZ4比PGLZ的压缩速度快很多。在不要求很高压缩比的场景下,LZ4更适合用于速度敏感型的数据压缩功能。
很多实际场景中,我们为了便于管理,经常将一些大文本和二进制文件存储到数据库里。这时,在不太影响读取速度的时候,存储空间当然是越小越好。很可惜,官方PostgreSQL13和之前的版本不支持LZ4压缩。
那么有没有可能,通过扩展PG的方式来使用lz4压缩功能呢?
答案是可以的。
最近,我就通过开发扩展PG函数的方式实现了lz4压缩和解压缩功能。可以方便的对二进制数据和文本数据进行压缩和解压缩。
我开发了4个自定义函数来进行数据压缩和解压:
# \dfList of functionsSchema | Name | Result data type | Argument data types | Type
--------+-------------+------------------+---------------------+--------public | lz4 | bytea | bytea bytea | normalpublic | lz4_utf8 | bytea | msg text | normalpublic | un_lz4 | bytea | bytea bytea | normalpublic | un_lz4_utf8 | text | bytea bytea | normal
(4 rows)
- lz4:接收bytea类型的数据,返回压缩后的bytea类型数据
- un_lz4:接收bytea类型的数据,返回解压后的bytea类型数据
- lz4_utf8:接收utf8编码的文本数据,返回解压后的bytea类型数据
- un_lz4_utf8:接收bytea类型的数据,返回解压后的utf8编码的文本数据
简单测试一下:
使用lz4压缩
# select lz4('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,你好,我好,大家好!'::bytea);lz4
--------------------------------------------------------------------------------\x3c0000001f61010009d22ce4bda0e5a5bdefbc8ce688910900c0e5a4a7e5aeb6e5a5bdefbc81
(1 row)
使用un_lz4解压缩,然后convert_from转换成文本
# select convert_from(un_lz4(lz4('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,你好,我好,大家好!'::bytea)), 'utf8');convert_from
----------------------------------------------------aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,你好,我好,大家好!
(1 row)
lz4_utf8函数和un_lz4_utf8函数用于在utf8编码环境里,对文本进行lz4压缩和解压缩还原成文本。
以中文绕口令为例。2倍绕口令字节长度:
# select length('八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑;八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑.'::bytea);length
--------176
(1 row)
lz4压缩后的字节长度:
# select length(lz4_utf8('八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑;八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑.'));length
--------90
(1 row)
压缩并解压缩:
# select un_lz4_utf8(lz4_utf8('八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑;八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑.'));un_lz4_utf8
--------------------------------------------------------------------------------------------------------------------------八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑;八百标兵奔北坡 炮兵并排北边跑 炮兵怕把标兵碰 标兵怕碰炮兵跑.
(1 row)
在数据表格中使用lz4压缩函数。
CREATE TABLE tb_article (id serial4 NOT NULL,title text NOT NULL,content bytea NOT NULL,create_time timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,CONSTRAINT tb_disco_exec_pk PRIMARY KEY (id)
);
插入数据,同时用函数进行内容压缩
# insert into tb_article(title, content) values('哈利波特', lz4_utf8('哈利波特哈利波特哈利波特哈利波特哈利波特哈利波特'));
INSERT 0 1
用 * 查询:
# select * from tb_article;id | title | content | create_time
----+-----------+----------------------------------------------------------+-------------------------------1 | 哈利波特 | \x48000000cfe59388e588a9e6b3a2e789b90c002360e6b3a2e789b9 | 2022-03-21 15:25:45.851421+002 | 哈利波特2 | \x48000000cfe59388e588a9e6b3a2e789b90c002360e6b3a2e789b9 | 2022-03-21 15:25:53.897295+00
(2 rows)
查询并用函数对指定字段进行解压:
# select id, title, un_lz4_utf8(content) as content, create_time from tb_article;id | title | content | create_time
----+-----------+--------------------------------------------------+-------------------------------1 | 哈利波特 | 哈利波特哈利波特哈利波特哈利波特哈利波特哈利波特 | 2022-03-21 15:25:45.851421+002 | 哈利波特2 | 哈利波特哈利波特哈利波特哈利波特哈利波特哈利波特 | 2022-03-21 15:25:53.897295+00
(2 rows)
如何安装扩展函数?
目前扩展函数仅支持Linux操作系统。压缩包里有四个目录:
- pg10.20
- pg11.15
- pg12.10
- pg13.6
每个目录对应PG的一个大版本。编译时是使用的这些具体版本。但应该可以适用于对应的大版本。
每个目录下有三个文件:
- pg_lz4--0.1.0.sql
- pg_lz4.control
- pg_lz4.so
安装时,将pg_lz4.so拷贝到xxx/postgresql/lib/目录下,pg_lz4.control和pg_lz4--0.1.0.sql文件拷贝到xxx/postgresql/share/extension/目录下。
然后,登录到数据库中创建扩展:
CREATE EXTENSION pg_lz4;
也可以指定创建扩展到具体某个schema下
CREATE EXTENSION IF NOT EXISTS pg_lz4 WITH SCHEMA xxxxxx
然后就可以使用了。
下载链接在这里。
大家使用过程中有任何问题可以找我处理。
当然,如果有对PG扩展开发有需求的,也可以找我聊聊。
我后续会针对PG扩展出更多的文章和函数库。
如何在PostgreSQL13和以下版本中使用lz4压缩文本和二进制数据相关推荐
- 如何在Windows 10 1709版本中保存锁屏壁纸
如何在Windows 10 1709版本中保存锁屏壁纸 [日期:2018-03-25] 来源:Linux公社 作者:醉落红尘 [字体:大 中 小] 许多用户似乎对Windows 10 Fall Cr ...
- VFP中使用winsock控件收发二进制数据
VFP中使用winsock控件收发网络数据时,如果包含有二进制数据,总是会丢失,或者与实际数据不符,这是由于字符转换的问题引起的. vfp的字符串本质与二进制数据没有任何区别,而所有的OCX控件和CO ...
- VB中关于word给文本框插入数据
这里我用到了一个工具,是在word中插入带有名称的文本框这样可以迅速找到对应的文本框插入数据,工具链接:https://pan.baidu.com/s/1FtftRezCtt9J9OmbZEdSIg ...
- 在XML中发送二进制数据
作者: BUILDER.COM XML通常被认为是用文本来描述数据的一种方法.例如,元素给出了文本名,元素的内容通常是基于文本的.但是有时候你需要输入数据而不是文本到你的XML文档.让我们来考虑你可能 ...
- SQL SERVER 2008中使用VARBINARY(MAX)进行二进制数据存取的实现方法
在数据库应用项目开发中,经常会使用一些二进制的图像数据,存储和读取显示图像数据主要采用的是路径链接法和内存流法.路径链接法是将图像文件保存在固定的路径下,数据库中只存储图像文件的路径和名称,此方法数据 ...
- 《Python Cookbook 3rd》笔记(5.9):读取二进制数据到可变缓冲区中
读取二进制数据到可变缓冲区中 问题 你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作.或者你想原地修改数据并将它写回到一个文件中去. 解法 为了读取数据到一个可变数组中,使用文件 ...
- 在 Web 数据控件中显示二进制数据54
简介 前面的教程中 , 我们介绍了将二进制数据与应用程序的基础数据模型相关联的两种方法 , 并使用FileUpload 控件从浏览器向 Web 服务器的文件系统上载.我们还将了解怎样将上载的二进制数据 ...
- html表单居中_如何在IE低版本中兼容HTML5表单属性placeholder属性
WEB开发数据提交是必不可少的,为了更友好的用户体验,通常需要给输入框一个默认的提示信息.HTML5技术提供了一个表单属性placeholder专门用于输入框默认提示,但是在IE低版本中根本不兼容. ...
- 棉花糖多少钱_如何在6.0棉花糖及更高版本中访问Android的正在运行的应用程序列表...
棉花糖多少钱 In Android 5.x and below, accessing your list of running apps was simple-you'd jump into Sett ...
最新文章
- PHP如何识别系统语言或浏览器语言
- Elasticsearch如何做到亿级数据查询毫秒级返回?
- Linux不停往外发包
- RabbitMQ Topic exchange
- 【长篇连载】桌面管理演义 第六回 违规言论别乱发 访问控制把你抓
- Django入门-项目创建与初识子应用
- python开发项目案例集锦 pdf_Python项目开发案例集锦 实战项目代码+配套文件
- 针对.NET开发者(neo-charm) 1.0 的NEO区块链架构参考模型
- Docker简介和安装
- 12009.IMU惯导传感器
- ArcGIS API for JavaScript——绘制工具(Draw)
- 乌鲁木齐市建筑物矢量数据(Shp格式+带高度)
- windows内核和Linux内核区别
- TCP和UDP区别详解
- android开题报告模板下载,毕业设计开题报告模板
- IDEA切换主题(换背景颜色)
- C# WinForm菜单和工具栏控件
- 索尼电视投屏声音与画面不同步现象解决方案
- 怎样在LaTeX中使用中文
- 色彩理论之彩虹CMYK值