OrioleDB:新一代PostgreSQL存儲引擎
PostgreSQL 12 引入了可插拔式的表存儲方法接口,允許為不同的表選擇不同的存儲機制,例如用于 OLTP 操作的堆表(HEAP、默認(rèn))、用于 OLAP 操作的列式表(Citus),以及用于超快速搜索處理的內(nèi)存表。
PostgreSQL 這一特性類似于 MySQL 的插件式存儲引擎,例如 InnoDB、MyISAM。
今天給大家介紹一個云原生的 PostgreSQL 存儲引擎:OrioleDB。
功能特性
OrioleDB 旨在解決 PostgreSQL 默認(rèn) HEAP 表在 OLTP(在線事務(wù)處理)場景中的一些性能瓶頸,并引入現(xiàn)代數(shù)據(jù)庫存儲技術(shù)的設(shè)計理念,提供更高的并發(fā)性能、更低的延遲,并減少存儲開銷。
OrioleDB 以擴展插件形式提供,基于 PostgreSQL 協(xié)議發(fā)布,提供的核心特性包括:
- 基于現(xiàn)代存儲技術(shù)(SSD、NVRAM)設(shè)計,優(yōu)化多核 CPU 和 NUMA 架構(gòu)下的資源分配,提升吞吐量。
- 基于 Undo Log 的 MVCC,將舊版本數(shù)據(jù)存儲在獨立的 Undo Log 而不是主表中。事務(wù)回滾或舊版本清理時直接操作 Undo Log,避免主表數(shù)據(jù)膨脹。同時還支持 64 位事務(wù) ID,避免了回卷問題。
- 聚簇索引,默認(rèn)使用聚簇索引(類似 MySQL/InnoDB),數(shù)據(jù)按主鍵順序存儲,減少隨機 I/O,提升范圍查詢性能。
- 壓縮存儲,支持頁級數(shù)據(jù)壓縮,降低存儲成本。
- 分布式支持,Copy-on-Write 檢查點提供結(jié)構(gòu)一致的數(shù)據(jù)快照,兼容 SSD 特性,并支持緊湊的行級 WAL 記錄?;谛屑?WAL 日志和 Raft 共識算法,支持并行回放和 Active-Active 多主架構(gòu),適合分布式部署。
使用示例
目前,OrioleDB 還處于 Beta 階段,最簡單的使用方法就是利用 Docker:
docker run -d --name orioledb -p 5432:5432 orioledb/orioledb
然后安裝擴展插件并創(chuàng)建數(shù)據(jù)表:
-- 創(chuàng)建擴展插件
CREATE EXTENSION orioledb;
-- 創(chuàng)建表
CREATETABLE blog_post
(
id int8 NOTNULL,
title textNOTNULL,
body textNOTNULL,
author textNOTNULL,
published_at timestamptz NOTNULLDEFAULTCURRENT_TIMESTAMP,
views bigintNOTNULL,
PRIMARYKEY(id)
)USING orioledb;-- 使用OrioleDB存儲引擎
-- 創(chuàng)建索引
CREATEINDEX blog_post_published_at ON blog_post(published_at);
OrioleDB 使用聚簇索引,因此主鍵的選擇對于性能至關(guān)重要;如果沒有指定主鍵字段,數(shù)據(jù)庫會基于 ctid 字段創(chuàng)建一個隱藏的替代主鍵。
接下來就可以執(zhí)行一些 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;
更詳細(xì)的使用介紹和注意事項可以參考以下官方文檔:
性能比較
以下是一些 OrioleDB 和默認(rèn) HEAP 存儲引擎的性能比較。
測試一:只讀測試顯示 OrioleDB 存儲引擎的性能是 PostgreSQL 默認(rèn)引擎的 4 倍。
測試二:讀寫測試顯示 OrioleDB 存儲引擎的性能是 PostgreSQL 默認(rèn)引擎的 4.5 倍。
測試三:OrioleDB 存儲引擎的磁盤讀?。↖OPS)是 PostgreSQL 默認(rèn)引擎的 1/6。
測試四:OrioleDB 存儲引擎的磁盤寫入比 PostgreSQL 默認(rèn)引擎大幅減少。