PostgreSQL笔记4: 市场地位、生态全景与行业应用实践

概述

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
    • 半结构化数据处理(JSONBXML 等)
    • 全文检索(tsvector/tsquerypgZoom
    • AI 与向量检索(pgvector
  • API 速览(pgvectorTimescaleDBpgAudit
  • 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_buckettime_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 内置了全文检索功能,通过 tsvectortsquery 类型实现:

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');

此外,pgZoomZomboDB 等扩展进一步增强了 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);

代码说明

  1. 表结构设计 : products 表同时包含了关系型字段(namedescription)、半结构化字段(attributes JSONB)、向量字段(embedding vector(3))以及全文检索向量(search_vector TSVECTOR)。

  2. 全文检索 : 使用 setweight 为不同字段分配权重(name 为 A 级,description 为 B 级),并创建 GIN 索引加速检索。

  3. 向量检索 : 使用 pgvector 扩展的 <=> 运算符计算余弦距离,并创建 IVFFlat 索引加速查询。

  4. 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 驱动(推荐,支持 pgvectorvector 类型)。

运行说明

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 调优复杂: 需要根据负载特征精细调整参数

解决方案

  1. 读写分离: 采用"一主多从"架构,将读流量分散到只读副本
  2. 分区表: 使用声明式分区减少大表维护开销
  3. pg_repack: 在线重建表以回收空间
  4. autovacuum 调优 : 根据更新频率调整 autovacuum_vacuum_scale_factorautovacuum_vacuum_threshold 等参数
  5. 考虑衍生方案: 如 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_bufferswork_memmaintenance_work_mem

官方文档

参考链接

总结

PostgreSQL 已从加州大学伯克利分校的学术项目演变为全球数据库市场中最具增长动能的头部系统。DB-Engines 排名中唯一实现年度正增长、Stack Overflow 开发者调查中连续两年蝉联"最受推崇数据库"------这些数据共同印证了 PostgreSQL 在技术成熟度、社区活跃度和产业影响力三个维度的全面领先。

在生态层面,PostgreSQL 的开源协议与可扩展架构催生了覆盖图数据库(AgensGraph)、时序数据库(TimescaleDB)、文档数据库兼容层(FerretDB)、向量检索(pgvector)等方向的庞大衍生生态。在国内信创市场,PostgreSQL 已成为众多国产数据库产品的核心基石。

在生产实践层面,OpenAI 以"一主五十从"的架构支撑 8 亿用户、平安集团部署上万套 PostgreSQL 实例、Instagram 基于 PostgreSQL 完成 IPO------这些案例共同证明了 PostgreSQL 从初创公司到超大规模平台的全场景适用性。

PostgreSQL 已不仅仅是一个关系型数据库,而是一个能够承载传统业务与 AI 时代智能应用的通用数据平台。

相关推荐
RainCity1 小时前
Java Swing 自定义组件库分享(十六)
java·笔记·后端
隔窗听雨眠2 小时前
Oracle误Truncate操作恢复:从原理到实战的完整指南
数据库·oracle
Lethehong2 小时前
MySQL迁移如何做到零改造?四层兼容方案详解
数据库·mysql·adb
蒸蒸yyyyzwd3 小时前
cpp选手秋招准备 学习笔记day7 webserver
笔记·学习
Json____3 小时前
五金制品行业-企业官网源码
java·大数据·数据库·企业站·wwwoop.com
深念Y4 小时前
Opencode Event 表写入优化方案
数据库·人工智能·ai·node.js·bug·优化·opencode
Chen—LSN5 小时前
C语言——数据在内存中的存储
c语言·开发语言·经验分享·笔记
竹枝溪5 小时前
MySQL进阶:约束、多表设计、多表查询与事务
java·数据库·mysql·事务·子查询·acid·多表查询
weixin_431600445 小时前
NestJS 入门(9):连上数据库,SQL 写在哪?
数据库·后端·sql·学习·nest.js