当前位置: 首页 > news >正文

OrioleDB: 新一代PostgreSQL存储引擎

PostgreSQL 12 引入了可插拔式的表存储方法接口,允许为不同的表选择不同的存储机制,例如用于 OLTP 操作的堆表(HEAP、默认)、用于 OLAP 操作的列式表(Citus),以及用于超快速搜索处理的内存表。

PostgreSQL 这一特性类似于 MySQL 的插件式存储引擎,例如 InnoDB、MyISAM。

今天给大家介绍一个云原生的 PostgreSQL 存储引擎:OrioleDB。

功能特性

OrioleDB 旨在解决 PostgreSQL 默认 HEAP 表在 OLTP(在线事务处理)场景中的一些性能瓶颈,并引入现代数据库存储技术的设计理念,提供更高的并发性能、更低的延迟,并减少存储开销。

在这里插入图片描述
OrioleDB 以扩展插件形式提供,基于 PostgreSQL 协议发布,提供的核心特性包括:

  • 基于现代存储技术(SSD、NVRAM)设计,优化多核 CPU 和 NUMA 架构下的资源分配,提升吞吐量。
  • 基于 Undo Log 的 MVCC,将旧版本数据存储在独立的 Undo Log 而不是主表中。事务回滚或旧版本清理时直接操作 Undo Log,避免主表数据膨胀。同时还支持 64 位事务 ID,避免了回卷问题。
  • 聚簇索引,默认使用聚簇索引(类似 MySQL/InnoDB),数据按主键顺序存储,减少随机 I/O,提升范围查询性能。
  • 压缩存储,支持页级数据压缩,降低存储成本。
  • 分布式支持,Copy-on-Write 检查点提供结构一致的数据快照,兼容 SSD 特性,并支持紧凑的行级 WAL 记录。基于行级 WAL 日志和 Raft 共识算法,支持并行回放和 Active-Active 多主架构,适合分布式部署。

使用示例

目前,OrioleDB 还处于 Beta 阶段,最简单的使用方法就是利用 Docker:

docker run -d --name orioledb -p 5432:5432 orioledb/orioledb

然后安装扩展插件并创建数据表:

-- 创建扩展插件
CREATE EXTENSION orioledb;

-- 创建表
CREATE TABLE blog_post
(
    id int8 NOT NULL,
    title text NOT NULL,
    body text NOT NULL,
    author text NOT NULL,
    published_at timestamptz  NOT NULL DEFAULT CURRENT_TIMESTAMP,
    views bigint NOT NULL,
    PRIMARY KEY(id)
) USING orioledb; -- 使用OrioleDB存储引擎

-- 创建索引
CREATE INDEX blog_post_published_at ON blog_post(published_at);

OrioleDB 使用聚簇索引,因此主键的选择对于性能至关重要;如果没有指定主键字段,数据库会基于 ctid 字段创建一个隐藏的替代主键。

接下来就可以执行一些 DML 操作:

INSERT INTO blog_post (id, title, body, author, views)
VALUES (1, 'Hello, World!', 'This is my first blog post.', 'John Doe', 1000);

SELECT * FROM blog_post ORDER BY published_at DESC LIMIT 10;

更详细的使用介绍和注意事项可以参考以下官方文档:

https://www.orioledb.com/docs

性能比较

以下是一些 OrioleDB 和默认 HEAP 存储引擎的性能比较:

测试一:只读测试显示 OrioleDB 存储引擎的性能是 PostgreSQL 默认引擎的 4 倍。

在这里插入图片描述

测试二:读写测试显示 OrioleDB 存储引擎的性能是 PostgreSQL 默认引擎的 4.5 倍。

在这里插入图片描述

测试三:OrioleDB 存储引擎的磁盘读取(IOPS)是 PostgreSQL 默认引擎的 1/6。

在这里插入图片描述

测试四:OrioleDB 存储引擎的磁盘写入比 PostgreSQL 默认引擎大幅减少。

在这里插入图片描述

相关文章:

  • stl之string的详解
  • 基于云的内容中台驱动企业智能服务升级
  • 并发编程--具名管道
  • HarmonyOS-应用程序框架基础
  • 应用于电池模块的 Fluent 共轭传热耦合
  • 【源码分析】Nacos服务注册源码分析-客户端
  • 解决load()文件报错zipfile.BadZipFile: File is not a zip file
  • 给easygui添加字体设置功能(tyysoft增强版)
  • WEB UI自动化测试中,元素定位的八大定位方式详解
  • 事务与异步方法(@Async)协同工作
  • python中print函数的flush如何使用
  • 什么是状态管理?有何种方式可以实现?它们之间有什么区别?
  • ChatGPT-4
  • MyBatis操纵数据库-XML实现(补充)
  • C语言指针与数组深度解析
  • 【ASMbits--常用算术运算指令】
  • 《从零手写Linux Shell:详解进程控制、环境变量与内建命令实现 --- 持续更新》
  • 掌握Windows命令提示符中的万能符:*号的全方位使用指南
  • 2.2[frontEnd]ESLint
  • 语音识别 FireRedASR-AED模型主要特点
  • “五一”假期,又有多地将向社会开放政府机关食堂
  • 诗词文赋俱当歌,听一听古诗词中的音乐性
  • 瞄准“美丽健康”赛道,上海奉贤如何打造宜居宜业之城?
  • 清华姚班,正走出一支军团
  • 地下管道密布成难题,道路修整如何破局?
  • 乌克兰否认俄收复库尔斯克州,称战斗仍在持续