概述
PostgreSQL 的发展历程是一部从学术项目到全球主流数据库的演进史。本文基于 DB-Engines 排名、Stack Overflow 年度调研以及国内外头部企业的生产实践,系统梳理 PostgreSQL 在全球数据库市场中的竞争格局、衍生生态体系以及在金融、互联网、AI 等关键行业的落地案例。
纲要
- PostgreSQL 全球市场格局(DB-Engines 排名解析)
- Stack Overflow 开发者调研与开发者认可度
- PostgreSQL 衍生生态
- 图数据库:
AgensGraph - MongoDB 兼容层:
FerretDB - 时序数据库:
TimescaleDB - 云原生与分布式衍生
- 图数据库:
- 国际典型应用案例
OpenAI: 单主库 + 50 副本Instagram: 从 PostgreSQL 到 IPO- 其他企业(Apple, Skype, Uber 等)
- 国内应用场景与信创生态
- 金融行业: 平安集团
- 互联网行业: 去哪儿、探探、GitLab 等
- 信创国产化: 达梦、人大金仓、瀚高(IvorySQL)等
- 行业场景与技术能力
- 时序数据处理(
BRIN索引、TimescaleDB) - 半结构化数据处理(
JSONB、XML等) - 全文检索(
tsvector/tsquery、pgZoom) - AI 与向量检索(
pgvector)
- 时序数据处理(
- API 速览(
pgvector、TimescaleDB、pgAudit) - Demo 简单示例(Node.js +
pg驱动,演示全文检索、JSONB 查询、向量检索) - 项目难点与解决方案(MVCC 写放大、表膨胀、
autovacuum调优) - 官方文档与参考链接
全球数据库市场格局:DB-Engines 排名解析
DB-Engines 是全球数据库领域最具权威性的流行度排名系统,其评分综合了搜索引擎热度、技术讨论活跃度、就业市场需求、文档丰富度、社区参与度及生态活跃度等多个维度。
根据 DB-Engines 2026 年 8 月发布的排名数据,全球数据库市场头部格局如下:
| 排名 | 数据库系统 | 2026年8月得分 | 月度变化 | 年度变化 |
|---|---|---|---|---|
| 1 | Oracle | 1123.43 | -8.94 | -97.27 |
| 2 | MySQL | 842.32 | -4.14 | -73.15 |
| 3 | Microsoft SQL Server | 694.56 | -4.40 | -59.59 |
| 4 | PostgreSQL | 684.58 | -3.23 | +13.32 |
| 5 | MongoDB | 384.88 | -1.74 | -10.70 |
从上述数据可以清晰地看到:
- PostgreSQL 是头部数据库中唯一实现年度正增长的。在 Oracle、MySQL、SQL Server 三大传统数据库得分持续下滑的背景下,PostgreSQL 年度涨幅达 13.32 分,与 SQL Server 的差距已缩小至 9.98 分。
- 增长动能发生根本性逆转。2026 年上半年,PostgreSQL 的 DB-Engines 得分增长 21.97 分,位居所有数据库之首。这一增长幅度远超 Databricks(+16.04)、MongoDB(+11.24)等竞品。
- 开源数据库整体崛起。在 2026 年上半年增长最快的十大数据库中,开源数据库占据主导地位,包括 Redis、ClickHouse、Apache Cassandra 等。
在国内市场,墨天轮(Modb)榜单是观察国产数据库流行度的重要参考。PostgreSQL 凭借其技术先进性和生态兼容性,已成为众多国产数据库产品的核心基石。
Stack Overflow 开发者调研:连续两年蝉联榜首
Stack Overflow 年度开发者调查是全球规模最大的开发者生态调研之一。在 2024 年的调查中,PostgreSQL 以 48.7% 的受访者使用率位居第一,连续第二年超越 MySQL(40.3%)。
#mermaid-svg-q8DedpSOIvRittP5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-q8DedpSOIvRittP5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-q8DedpSOIvRittP5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-q8DedpSOIvRittP5 .error-icon{fill:#552222;}#mermaid-svg-q8DedpSOIvRittP5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-q8DedpSOIvRittP5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-q8DedpSOIvRittP5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-q8DedpSOIvRittP5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-q8DedpSOIvRittP5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-q8DedpSOIvRittP5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-q8DedpSOIvRittP5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-q8DedpSOIvRittP5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-q8DedpSOIvRittP5 .marker.cross{stroke:#333333;}#mermaid-svg-q8DedpSOIvRittP5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-q8DedpSOIvRittP5 p{margin:0;}#mermaid-svg-q8DedpSOIvRittP5 .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-q8DedpSOIvRittP5 .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-q8DedpSOIvRittP5 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-q8DedpSOIvRittP5 .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-q8DedpSOIvRittP5 .legend text{fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-q8DedpSOIvRittP5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 34% 28% 23% 14% 2024年Stack Overflow开发者调查-数据库使用率 PostgreSQL MySQL SQLite 其他
更值得关注的是 "最受推崇数据库"(Most Admired Database) 维度------PostgreSQL 以约 74.5% 的推崇率蝉联榜首。这一指标反映了开发者对数据库技术本身的认可度与满意度,而非单纯的使用率。
从历史趋势来看,PostgreSQL 于 2018 年首次出现在 Stack Overflow 开发者调查中,当时使用率为 33%。六年后的 2024 年,这一数字已攀升至 49%,增长轨迹充分说明了 PostgreSQL 在开发者社区中的持续渗透。
PostgreSQL 衍生生态:从内核到多模扩展
PostgreSQL 的开源协议(PostgreSQL License)及其可扩展架构,催生了庞大的衍生数据库生态。PostgreSQL 官方 Wiki 维护了一份完整的衍生数据库列表。以下是几个代表性的生态项目:
图数据库: AgensGraph
AgensGraph 是由 Bitnine Global 开发的多模图数据库,基于 PostgreSQL 构建,同时支持关系型数据模型和属性图数据模型。它支持使用 Cypher 查询语言进行图遍历,并提供 SQL 与 Cypher 的混合查询能力。AgensGraph 还可与 PostGIS、pgvector 等 PostgreSQL 扩展协同工作。
MongoDB 兼容层: FerretDB
FerretDB 是一个开源的 MongoDB 替代方案,它通过实现 MongoDB Wire Protocol,使客户端可以使用标准 MongoDB 驱动连接,而数据实际存储在 PostgreSQL 中。FerretDB 基于 Apache 2.0 许可发布,为希望从 MongoDB 迁移至 PostgreSQL 生态的团队提供了平滑的过渡路径。
时序数据库: TimescaleDB
TimescaleDB 是 PostgreSQL 生态中最成熟的时序数据库扩展。它通过超表(Hypertable)抽象实现了时序数据的自动分片,并提供了 time_bucket、time_bucket_gapfill 等专用函数,支持降采样、数据填充等时序分析场景。
安装 TimescaleDB 后,通过以下 SQL 即可启用:
sql
-- 创建时序扩展
CREATE EXTENSION IF NOT EXISTS timescaledb;
-- 创建超表
CREATE TABLE metrics (
time TIMESTAMPTZ NOT NULL,
device_id INTEGER NOT NULL,
cpu_usage FLOAT,
memory_usage FLOAT
);
SELECT create_hypertable('metrics', 'time');
-- 使用 time_bucket 进行降采样
SELECT
time_bucket('5 minutes', time) AS bucket,
device_id,
AVG(cpu_usage) AS avg_cpu
FROM metrics
WHERE time > NOW() - INTERVAL '1 day'
GROUP BY bucket, device_id;
云原生与分布式衍生
- Apache Cloudberry: 2024 年从 Apache 孵化的 MPP 架构分布式数据库,继承自 Greenplum Database 的开源版本。
- Neon: 开源的 serverless PostgreSQL 实现,借鉴了 AWS Aurora 的存算分离架构。
- Greenplum Database: 基于 PostgreSQL 的 MPP 大数据分析平台,其开源版本已于 2024 年 5 月归档。
国际典型应用案例
PostgreSQL 在全球范围内的生产环境部署已覆盖从初创公司到超大规模互联网平台的各个层级。
OpenAI: 单主库 + 50 副本支撑 8 亿用户
OpenAI 是 PostgreSQL 规模化部署最具代表性的案例之一。在 2026 年的 PGCon.Dev 上,OpenAI 工程师披露了其 PostgreSQL 架构的核心参数:
- 1 个主库(部署在 Azure Database for PostgreSQL)负责所有写入操作
- 近 50 个只读副本分布在全球多个区域,承担读流量
- 支撑 8 亿 ChatGPT 用户 ,每秒处理 数百万次查询(QPS)
- p99 延迟控制在 10-19 毫秒
- 可用性达到 99.999%
值得注意的是,OpenAI 在单集群写入吞吐接近上限后,选择将可水平分片的写密集型负载迁移至 Azure Cosmos DB(基于 PostgreSQL + Citus),而非采用传统的应用层手动分片方案。
OpenAI 的实践表明,PostgreSQL 在读多写少的场景下能够可靠地扩展到超大规模。这一案例对于许多没有充分理由提前采用复杂分布式数据库的团队而言,具有重要的参考价值。
Instagram: 从 PostgreSQL 到 IPO
Instagram 在被 Facebook 收购之前,其整个后端几乎完全基于 PostgreSQL 构建。Instagram 的工程团队曾公开分享过其 PostgreSQL 集群架构------一套集群承载了约 40 万 QPS。当面临单库写入瓶颈时,Instagram 采用了应用层分库分表(Sharding)方案解决了扩展性问题。
其他国际企业
- Apple: 内部大量采用 PostgreSQL 作为核心数据库
- Skype: 生产环境核心数据库
- Uber: 早期核心业务数据库
- Cisco、Sony、Spotify 等均在生产环境中使用 PostgreSQL 作为核心数据存储
国内应用场景与信创生态
金融行业: 平安集团
平安集团是国内最大的 PostgreSQL 用户之一,拥有超过 10,000 套 PostgreSQL 实例,版本覆盖从 9.4 到 15,服务于平安旗下各业务单元(BU)。平安基于 PostgreSQL 自研的 RASESQL 集中式数据库已通过中国信息安全测评中心的安全可靠测评认证(I 级)。
金融行业对 PostgreSQL 的青睐主要源于:
- 严格的事务一致性: PostgreSQL 原生支持 ACID 事务
- 安全审计能力 : 通过
pgAudit扩展实现对表访问、敏感字段操作的细粒度审计日志 - 数据脱敏 : 借助
pgAnonymizer等工具实现身份证号、手机号等敏感信息的自动脱敏
互联网行业
国内众多互联网公司深度采用 PostgreSQL:
- 去哪儿、探探: 核心业务数据库
- GitLab: 基于 PostgreSQL 的代码托管平台
- 字节跳动、腾讯、阿里、华为: 各自推出基于 PostgreSQL 的云数据库产品
国内云厂商的 PostgreSQL 兼容产品包括:
| 厂商 | 产品名称 | 核心特性 |
|---|---|---|
| 阿里云 | PolarDB for PostgreSQL | 100% 兼容 PostgreSQL,存算分离架构,支持集中式与分布式部署 |
| 腾讯云 | TDSQL-C PostgreSQL 版 | 100% 兼容 PostgreSQL,存算分离,超百万级 QPS |
| 华为云 | GaussDB | 基于 PostgreSQL 标准 API,支持行存与 Ustore |
信创国产化: PostgreSQL 成为核心基石
在国内信创(信息技术应用创新)的大背景下,PostgreSQL 凭借其开源协议(类 BSD)和技术成熟度,已成为国产数据库体系的核心基石。众多国产数据库产品基于 PostgreSQL 技术路线开发:
- 达梦数据库 、南大通用 、人大金仓(KingbaseES)
- 瀚高数据库(IvorySQL) : 基于 PostgreSQL,深度兼容 Oracle 语法
- 海量数据库 、优炫数据库 、神州通用
IvorySQL 由瀚高股份发起,是一个基于 PostgreSQL 的开源数据库根社区,成立于 2021 年底。其最新版本已支持 x86、ARM、MIPS、LoongArch 等主流架构,并适配麒麟、统信 UOS 等国产操作系统。
在许多省市的信创项目招标文件中,PostgreSQL 及其兼容产品已频繁出现。掌握 PostgreSQL 技术,等同于掌握了国产数据库生态的通用钥匙。
行业场景与技术能力
时序数据处理
PostgreSQL 通过 BRIN 索引(Block Range Index)和 TimescaleDB 扩展,在时序数据场景中表现优异。BRIN 索引特别适用于数据按时间顺序写入、少有更新的场景,索引体积小、维护成本低。
TimescaleDB 提供的核心时序函数包括:
time_bucket(): 按时间间隔聚合time_bucket_gapfill(): 填充缺失的时间区间- 自动压缩与数据保留策略
半结构化数据处理
PostgreSQL 从 9.4 版本开始原生支持 JSONB 数据类型,提供高效的 JSON 存储与查询能力。此外还支持 XML、数组、范围类型、MAC 地址 等多种半结构化数据类型。
sql
-- JSONB 数据存储与查询
CREATE TABLE user_profiles (
id SERIAL PRIMARY KEY,
profile JSONB
);
INSERT INTO user_profiles (profile) VALUES
('{"name": "张三", "age": 30, "tags": ["developer", "postgres"]}');
-- JSONB 索引与查询
CREATE INDEX idx_profile_name ON user_profiles USING GIN ((profile -> 'name'));
SELECT * FROM user_profiles
WHERE profile @> '{"tags": ["postgres"]}';
全文检索
PostgreSQL 内置了全文检索功能,通过 tsvector 和 tsquery 类型实现:
sql
-- 创建全文检索索引
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT,
body TEXT,
ts_body TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', body)) STORED
);
CREATE INDEX idx_ts_body ON documents USING GIN (ts_body);
-- 全文检索查询
SELECT * FROM documents
WHERE ts_body @@ to_tsquery('english', 'postgresql & performance');
此外,pgZoom、ZomboDB 等扩展进一步增强了 PostgreSQL 的搜索能力。
AI 与向量检索
PostgreSQL 通过 pgvector 扩展实现了向量数据的存储与检索能力,支持:
- 向量类型的存储与索引(IVFFlat、HNSW)
- 余弦相似度、欧氏距离、内积等相似度度量
- 与关系型数据的混合查询
这使得 PostgreSQL 可以承担 RAG(检索增强生成) 应用中的向量数据库角色,将业务数据与向量数据存放在同一数据库中,避免数据搬运与数据孤岛问题。
API 速览
pgvector 向量操作 API
所属扩展 : pgvector
核心类型与函数:
sql
-- 创建向量扩展
CREATE EXTENSION vector;
-- 向量类型: vector(n)
CREATE TABLE items (
id SERIAL PRIMARY KEY,
embedding vector(384) -- 384维向量
);
-- 向量相似度查询
SELECT
id,
embedding <-> '[0.1, 0.2, ...]' AS distance -- 欧氏距离
FROM items
ORDER BY embedding <-> '[0.1, 0.2, ...]'
LIMIT 10;
-- 余弦相似度
SELECT * FROM items
ORDER BY embedding <=> '[0.1, 0.2, ...]' -- 余弦距离
LIMIT 10;
-- 内积相似度
SELECT * FROM items
ORDER BY embedding <#> '[0.1, 0.2, ...]' -- 负内积
LIMIT 10;
索引创建:
sql
-- IVFFlat 索引
CREATE INDEX idx_embedding_ivfflat ON items
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- HNSW 索引 (PostgreSQL 16+)
CREATE INDEX idx_embedding_hnsw ON items
USING hnsw (embedding vector_cosine_ops);
TimescaleDB 时序操作 API
所属扩展 : timescaledb
超表创建:
sql
-- 创建超表
CREATE TABLE conditions (
time TIMESTAMPTZ NOT NULL,
location TEXT NOT NULL,
temperature FLOAT
);
SELECT create_hypertable('conditions', 'time');
时序聚合函数:
sql
-- time_bucket: 按时间间隔聚合
SELECT
time_bucket('1 hour', time) AS hour,
location,
AVG(temperature) AS avg_temp
FROM conditions
WHERE time > NOW() - INTERVAL '7 days'
GROUP BY hour, location
ORDER BY hour DESC;
-- time_bucket_gapfill: 填充缺失区间
SELECT
time_bucket_gapfill('1 hour', time) AS hour,
location,
AVG(temperature) AS avg_temp
FROM conditions
WHERE time > NOW() - INTERVAL '7 days'
GROUP BY hour, location;
pgAudit 审计 API
所属扩展 : pgaudit
启用审计:
sql
-- 加载扩展 (需在 postgresql.conf 中配置 shared_preload_libraries)
CREATE EXTENSION pgaudit;
-- 配置审计日志 (需在 postgresql.conf 中设置)
-- pgaudit.log = 'ddl, role, read, write'
-- pgaudit.log_catalog = off
-- pgaudit.log_parameter = on
-- 会话级审计配置
SET pgaudit.log = 'read, write';
Demo 简单示例
本 Demo 演示如何使用 Node.js 连接 PostgreSQL,并展示 JSONB 存储、全文检索和向量检索三种能力的综合使用。
运行说明
环境要求:
- Node.js 18+
- PostgreSQL 16+(需安装
pgvector扩展) - npm 包:
pg、@neondatabase/serverless
安装依赖:
bash
npm init -y
npm install pg @neondatabase/serverless
初始化数据库:
sql
-- 创建数据库
CREATE DATABASE blog_demo;
-- 连接数据库后创建扩展
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
完整代码
ts
// index.ts
import { Client } from 'pg';
const client = new Client({
host: 'localhost',
port: 5432,
database: 'blog_demo',
user: 'postgres',
password: 'your_password',
});
async function main() {
await client.connect();
// 1. 创建表结构
await client.query(`
CREATE TABLE IF NOT EXISTS products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
attributes JSONB,
embedding vector(3),
search_vector TSVECTOR GENERATED ALWAYS AS (
setweight(to_tsvector('english', name), 'A') ||
setweight(to_tsvector('english', COALESCE(description, '')), 'B')
) STORED
);
`);
// 2. 创建索引
await client.query(`
CREATE INDEX IF NOT EXISTS idx_products_search ON products
USING GIN (search_vector);
CREATE INDEX IF NOT EXISTS idx_products_embedding ON products
USING ivfflat (embedding vector_cosine_ops) WITH (lists = 10);
`);
// 3. 插入示例数据
await client.query(`
INSERT INTO products (name, description, attributes, embedding) VALUES
('PostgreSQL Database', 'Advanced open-source relational database',
'{"version": 16, "license": "PostgreSQL License"}', '[0.9, 0.1, 0.2]'),
('TimescaleDB', 'Time-series extension for PostgreSQL',
'{"type": "extension", "category": "时序"}', '[0.2, 0.8, 0.1]'),
('pgvector', 'Vector similarity search for PostgreSQL',
'{"type": "extension", "category": "AI"}', '[0.1, 0.2, 0.9]')
ON CONFLICT DO NOTHING;
`);
// 4. 全文检索查询
const searchResult = await client.query(`
SELECT id, name, description
FROM products
WHERE search_vector @@ to_tsquery('english', 'database & open')
ORDER BY ts_rank(search_vector, to_tsquery('english', 'database & open')) DESC;
`);
console.log('全文检索结果:', searchResult.rows);
// 5. JSONB 查询
const jsonResult = await client.query(`
SELECT id, name, attributes
FROM products
WHERE attributes @> '{"category": "AI"}';
`);
console.log('JSONB 查询结果:', jsonResult.rows);
// 6. 向量相似度查询
const vectorResult = await client.query(`
SELECT id, name,
1 - (embedding <=> '[0.1, 0.2, 0.9]') AS similarity
FROM products
ORDER BY embedding <=> '[0.1, 0.2, 0.9]'
LIMIT 3;
`);
console.log('向量相似度查询结果:', vectorResult.rows);
await client.end();
}
main().catch(console.error);
代码说明
-
表结构设计 :
products表同时包含了关系型字段(name、description)、半结构化字段(attributes JSONB)、向量字段(embedding vector(3))以及全文检索向量(search_vector TSVECTOR)。 -
全文检索 : 使用
setweight为不同字段分配权重(name为 A 级,description为 B 级),并创建 GIN 索引加速检索。 -
向量检索 : 使用
pgvector扩展的<=>运算符计算余弦距离,并创建 IVFFlat 索引加速查询。 -
JSONB 查询 : 使用
@>运算符进行 JSON 文档的包含查询。
技术点总结
| 技术能力 | 实现方式 | 适用场景 |
|---|---|---|
| 全文检索 | tsvector + tsquery + GIN 索引 |
内容搜索、日志分析 |
| 半结构化数据 | JSONB 类型 + GIN 索引 |
灵活 Schema、配置存储 |
| 向量检索 | pgvector 扩展 + IVFFlat/HNSW 索引 |
RAG、推荐系统、语义搜索 |
| 混合查询 | 上述能力的 SQL 组合 | 复杂业务场景的统一数据访问 |
其他语言示例
PostgreSQL 多语言 Demo 补充:Go / Python / Java
本文作为 Node.js Demo 的补充,提供 Go、Python、Java 三种语言的完整可运行示例,均基于同一套表结构(products),演示 JSONB 存储、全文检索和向量检索三种能力的综合使用。
运行环境通用要求
- PostgreSQL 16+,已安装
pgvector扩展 - 数据库名
blog_demo,用户postgres,密码your_password(请根据实际情况修改) - 初始 SQL(所有语言共用):
sql
CREATE DATABASE blog_demo;
\c blog_demo
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE TABLE IF NOT EXISTS products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
attributes JSONB,
embedding vector(3),
search_vector TSVECTOR GENERATED ALWAYS AS (
setweight(to_tsvector('english', name), 'A') ||
setweight(to_tsvector('english', COALESCE(description, '')), 'B')
) STORED
);
CREATE INDEX IF NOT EXISTS idx_products_search ON products USING GIN (search_vector);
CREATE INDEX IF NOT EXISTS idx_products_embedding ON products USING ivfflat (embedding vector_cosine_ops) WITH (lists = 10);
Go Demo
使用 pgx 驱动(推荐,支持 pgvector 的 vector 类型)。
运行说明
bash
go mod init demo
go get github.com/jackc/pgx/v5
go run main.go
完整代码
go
// main.go
package main
import (
"context"
"fmt"
"log"
"github.com/jackc/pgx/v5"
)
func main() {
ctx := context.Background()
conn, err := pgx.Connect(ctx, "postgres://postgres:your_password@localhost:5432/blog_demo")
if err != nil {
log.Fatal(err)
}
defer conn.Close(ctx)
// 1. 清空表(可选)
_, _ = conn.Exec(ctx, "TRUNCATE products RESTART IDENTITY")
// 2. 插入示例数据
insertSQL := `
INSERT INTO products (name, description, attributes, embedding) VALUES
($1, $2, $3, $4),
($5, $6, $7, $8),
($9, $10, $11, $12)
`
_, err = conn.Exec(ctx, insertSQL,
"PostgreSQL Database", "Advanced open-source relational database",
`{"version": 16, "license": "PostgreSQL License"}`, "[0.9, 0.1, 0.2]",
"TimescaleDB", "Time-series extension for PostgreSQL",
`{"type": "extension", "category": "时序"}`, "[0.2, 0.8, 0.1]",
"pgvector", "Vector similarity search for PostgreSQL",
`{"type": "extension", "category": "AI"}`, "[0.1, 0.2, 0.9]",
)
if err != nil {
log.Fatal("插入失败:", err)
}
// 3. 全文检索查询
rows, err := conn.Query(ctx, `
SELECT id, name, description
FROM products
WHERE search_vector @@ to_tsquery('english', 'database & open')
ORDER BY ts_rank(search_vector, to_tsquery('english', 'database & open')) DESC
`)
if err != nil {
log.Fatal(err)
}
fmt.Println("=== 全文检索结果 ===")
for rows.Next() {
var id int
var name, desc string
rows.Scan(&id, &name, &desc)
fmt.Printf("id=%d name=%s desc=%s\n", id, name, desc)
}
rows.Close()
// 4. JSONB 查询
rows, err = conn.Query(ctx, `
SELECT id, name, attributes
FROM products
WHERE attributes @> '{"category": "AI"}'
`)
if err != nil {
log.Fatal(err)
}
fmt.Println("=== JSONB 查询结果 ===")
for rows.Next() {
var id int
var name string
var attrs map[string]interface{}
rows.Scan(&id, &name, &attrs)
fmt.Printf("id=%d name=%s attrs=%v\n", id, name, attrs)
}
rows.Close()
// 5. 向量相似度查询
rows, err = conn.Query(ctx, `
SELECT id, name, 1 - (embedding <=> '[0.1, 0.2, 0.9]') AS similarity
FROM products
ORDER BY embedding <=> '[0.1, 0.2, 0.9]'
LIMIT 3
`)
if err != nil {
log.Fatal(err)
}
fmt.Println("=== 向量相似度查询结果 ===")
for rows.Next() {
var id int
var name string
var sim float64
rows.Scan(&id, &name, &sim)
fmt.Printf("id=%d name=%s similarity=%.4f\n", id, name, sim)
}
rows.Close()
}
Python Demo
使用 psycopg2(同步)或 asyncpg(异步)。本示例采用 psycopg2,配合 psycopg2.extras 处理 JSONB。
运行说明
bash
pip install psycopg2-binary
python main.py
完整代码
python
# main.py
import psycopg2
import psycopg2.extras
conn = psycopg2.connect(
host="localhost",
port=5432,
database="blog_demo",
user="postgres",
password="your_password"
)
conn.autocommit = True
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
# 1. 清空表
cur.execute("TRUNCATE products RESTART IDENTITY")
# 2. 插入示例数据
insert_sql = """
INSERT INTO products (name, description, attributes, embedding) VALUES
(%s, %s, %s, %s),
(%s, %s, %s, %s),
(%s, %s, %s, %s)
"""
cur.execute(insert_sql, (
"PostgreSQL Database", "Advanced open-source relational database",
psycopg2.extras.Json({"version": 16, "license": "PostgreSQL License"}),
"[0.9, 0.1, 0.2]",
"TimescaleDB", "Time-series extension for PostgreSQL",
psycopg2.extras.Json({"type": "extension", "category": "时序"}),
"[0.2, 0.8, 0.1]",
"pgvector", "Vector similarity search for PostgreSQL",
psycopg2.extras.Json({"type": "extension", "category": "AI"}),
"[0.1, 0.2, 0.9]",
))
# 3. 全文检索查询
cur.execute("""
SELECT id, name, description
FROM products
WHERE search_vector @@ to_tsquery('english', 'database & open')
ORDER BY ts_rank(search_vector, to_tsquery('english', 'database & open')) DESC
""")
print("=== 全文检索结果 ===")
for row in cur.fetchall():
print(f"id={row['id']} name={row['name']} desc={row['description']}")
# 4. JSONB 查询
cur.execute("""
SELECT id, name, attributes
FROM products
WHERE attributes @> '{"category": "AI"}'
""")
print("=== JSONB 查询结果 ===")
for row in cur.fetchall():
print(f"id={row['id']} name={row['name']} attrs={row['attributes']}")
# 5. 向量相似度查询
cur.execute("""
SELECT id, name, 1 - (embedding <=> '[0.1, 0.2, 0.9]') AS similarity
FROM products
ORDER BY embedding <=> '[0.1, 0.2, 0.9]'
LIMIT 3
""")
print("=== 向量相似度查询结果 ===")
for row in cur.fetchall():
print(f"id={row['id']} name={row['name']} similarity={row['similarity']:.4f}")
cur.close()
conn.close()
Java Demo
使用 JDBC 驱动(org.postgresql:postgresql)和 pgvector 的 Java 客户端(可选)。本示例直接通过 JDBC 传递向量字符串,不依赖额外库。
运行说明
-
Maven 依赖:
xml<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.7.3</version> </dependency> -
编译运行:
javac -cp postgresql-42.7.3.jar Main.java && java -cp .:postgresql-42.7.3.jar Main
完整代码
java
// Main.java
import java.sql.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
String url = "jdbc:postgresql://localhost:5432/blog_demo";
Properties props = new Properties();
props.setProperty("user", "postgres");
props.setProperty("password", "your_password");
try (Connection conn = DriverManager.getConnection(url, props)) {
// 1. 清空表
try (Statement stmt = conn.createStatement()) {
stmt.execute("TRUNCATE products RESTART IDENTITY");
}
// 2. 插入示例数据
String insertSQL = """
INSERT INTO products (name, description, attributes, embedding) VALUES
(?, ?, ?::jsonb, ?::vector),
(?, ?, ?::jsonb, ?::vector),
(?, ?, ?::jsonb, ?::vector)
""";
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
pstmt.setString(1, "PostgreSQL Database");
pstmt.setString(2, "Advanced open-source relational database");
pstmt.setString(3, "{\"version\": 16, \"license\": \"PostgreSQL License\"}");
pstmt.setString(4, "[0.9, 0.1, 0.2]");
pstmt.setString(5, "TimescaleDB");
pstmt.setString(6, "Time-series extension for PostgreSQL");
pstmt.setString(7, "{\"type\": \"extension\", \"category\": \"时序\"}");
pstmt.setString(8, "[0.2, 0.8, 0.1]");
pstmt.setString(9, "pgvector");
pstmt.setString(10, "Vector similarity search for PostgreSQL");
pstmt.setString(11, "{\"type\": \"extension\", \"category\": \"AI\"}");
pstmt.setString(12, "[0.1, 0.2, 0.9]");
pstmt.executeUpdate();
}
// 3. 全文检索查询
String searchSQL = """
SELECT id, name, description
FROM products
WHERE search_vector @@ to_tsquery('english', 'database & open')
ORDER BY ts_rank(search_vector, to_tsquery('english', 'database & open')) DESC
""";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(searchSQL)) {
System.out.println("=== 全文检索结果 ===");
while (rs.next()) {
System.out.printf("id=%d name=%s desc=%s%n",
rs.getInt("id"), rs.getString("name"), rs.getString("description"));
}
}
// 4. JSONB 查询
String jsonSQL = """
SELECT id, name, attributes
FROM products
WHERE attributes @> '{"category": "AI"}'
""";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(jsonSQL)) {
System.out.println("=== JSONB 查询结果 ===");
while (rs.next()) {
System.out.printf("id=%d name=%s attrs=%s%n",
rs.getInt("id"), rs.getString("name"), rs.getString("attributes"));
}
}
// 5. 向量相似度查询
String vectorSQL = """
SELECT id, name, 1 - (embedding <=> '[0.1, 0.2, 0.9]') AS similarity
FROM products
ORDER BY embedding <=> '[0.1, 0.2, 0.9]'
LIMIT 3
""";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(vectorSQL)) {
System.out.println("=== 向量相似度查询结果 ===");
while (rs.next()) {
System.out.printf("id=%d name=%s similarity=%.4f%n",
rs.getInt("id"), rs.getString("name"), rs.getDouble("similarity"));
}
}
}
}
}
阶段性 demo总结
以上 Go、Python、Java 三个 Demo 与 Node.js 版本逻辑完全一致,均实现了:
- 表结构创建(若已存在则跳过)
- 插入三条测试数据(包含 JSONB 和向量字段)
- 全文检索查询(
tsvector+tsquery) - JSONB 包含查询(
@>运算符) - 向量余弦相似度查询(
<=>运算符)
所有代码均采用各自生态的标准驱动,可直接运行验证。实际生产环境中,建议根据并发需求选择连接池(如 Go 的 pgxpool、Python 的 psycopg2.pool、Java 的 HikariCP)。
项目难点与解决方案
核心难点
PostgreSQL 在实际生产环境中面临的核心挑战源于其 MVCC(多版本并发控制) 实现机制:
- 写放大 : 每次
UPDATE操作即使只修改一个字段,也会复制整行生成新版本 - 读放大: 查询为获取最新版本,需要扫描多个行版本(含"死元组")
- 表膨胀: 频繁更新导致表与索引持续膨胀
autovacuum调优复杂: 需要根据负载特征精细调整参数
解决方案
- 读写分离: 采用"一主多从"架构,将读流量分散到只读副本
- 分区表: 使用声明式分区减少大表维护开销
pg_repack: 在线重建表以回收空间autovacuum调优 : 根据更新频率调整autovacuum_vacuum_scale_factor、autovacuum_vacuum_threshold等参数- 考虑衍生方案: 如 Oracle 兼容场景可评估 IvorySQL,写密集场景可评估 Neon 的存算分离架构
广度
PostgreSQL 的应用场景覆盖了:
- OLTP 事务处理
- OLAP 分析查询
- 时序数据处理(TimescaleDB)
- 图数据存储(AgensGraph)
- 向量检索(pgvector)
- 全文检索(内置 + pgZoom)
- 文档存储(JSONB)
深度
PostgreSQL 的技术深度体现在:
- 内核级别的扩展机制(
CREATE EXTENSION) - 多模型数据支持(关系型、文档、图、向量、时序)
- 丰富的索引类型(B-Tree、Hash、GIN、GiST、SP-GiST、BRIN)
- 成熟的 MVCC 与事务隔离级别
复杂度
- 运维复杂度 :
autovacuum调优、流复制管理、备份恢复 - 扩展管理: 第三方扩展的版本兼容性与升级策略
- 性能调优 : 需要深入理解查询计划、索引选择、内存参数(
shared_buffers、work_mem、maintenance_work_mem)
官方文档
- PostgreSQL 官方文档 : https://www.postgresql.org/docs/
- PostgreSQL Wiki : https://wiki.postgresql.org/
- pgvector 官方仓库 : https://github.com/pgvector/pgvector
- TimescaleDB 官方文档 : https://docs.timescale.com/
- DB-Engines 排名 : https://db-engines.com/en/ranking
参考链接
- Stack Overflow 2024 开发者调查 : https://survey.stackoverflow.co/2024/
- PostgreSQL 衍生数据库列表(官方 Wiki) : https://wiki.postgresql.org/wiki/PostgreSQL_derived_databases
- OpenAI PostgreSQL 架构实践 : https://yunpan.plus/t/11125-1-1
- DB-Engines 2026 年上半年增长报告 : https://www.red-gate.com/our-company/newsroom/press-releases/db-engines-postgresql-leads-h1-2026-database-growth-as-data-platforms-gain-momentum/
- IvorySQL 开源社区 : https://www.ivorysql.org/
- AgensGraph 官方文档 : https://bitnine.net/agensgraph/
总结
PostgreSQL 已从加州大学伯克利分校的学术项目演变为全球数据库市场中最具增长动能的头部系统。DB-Engines 排名中唯一实现年度正增长、Stack Overflow 开发者调查中连续两年蝉联"最受推崇数据库"------这些数据共同印证了 PostgreSQL 在技术成熟度、社区活跃度和产业影响力三个维度的全面领先。
在生态层面,PostgreSQL 的开源协议与可扩展架构催生了覆盖图数据库(AgensGraph)、时序数据库(TimescaleDB)、文档数据库兼容层(FerretDB)、向量检索(pgvector)等方向的庞大衍生生态。在国内信创市场,PostgreSQL 已成为众多国产数据库产品的核心基石。
在生产实践层面,OpenAI 以"一主五十从"的架构支撑 8 亿用户、平安集团部署上万套 PostgreSQL 实例、Instagram 基于 PostgreSQL 完成 IPO------这些案例共同证明了 PostgreSQL 从初创公司到超大规模平台的全场景适用性。
PostgreSQL 已不仅仅是一个关系型数据库,而是一个能够承载传统业务与 AI 时代智能应用的通用数据平台。