教程雨

OKX新手入门教程导航,收录OKX注册、充值、买币、提现等基础操作教程

数据库圆柱图标融合蓝色大象轮廓,多色数据光带流动,顶部AI神经元网络象征pgvector向量能力

PostgreSQL数据库从入门到精通:2026年最流行数据库完整学习指南

前言:为什么2026年PostgreSQL成为首选?

说实话,三年前我选数据库时,第一反应还是MySQL。毕竟用的多、资料多、社区活跃。但去年做AI应用时需要向量检索,我调研了一圈发现:PostgreSQL的pgvector扩展简直是神器,一套数据库同时搞定关系数据和向量数据,开发效率直接翻倍。

更让我惊讶的是Stack Overflow的2025年开发者调查——PostgreSQL的受欢迎程度已经超过了MySQL,差距还在持续拉大。像Instagram、Reddit、Uber、Apple这些大厂都在用PostgreSQL,它的功能和性能已经得到充分验证。

今天就把我学习PostgreSQL的经验整理出来,希望帮你少走弯路。

PostgreSQL的核心优势

  • 功能强大:支持JSON、全文搜索、向量检索、地理信息等多种数据类型
  • 扩展性强:可以自定义数据类型、函数、操作符,甚至用Python编写存储过程
  • 标准兼容:完整支持SQL标准,事务、外键、视图、触发器应有尽有
  • 性能出色:MVCC并发控制、WAL日志、查询优化器表现出色
  • AI友好:pgvector扩展让PostgreSQL成为向量数据库的首选
  • 开源免费:BSD许可证,完全免费商用
四阶段攀登阶梯,入门基础进阶技能高级特性运维管理,蓝绿紫金配色展示完整学习路径

第一部分:PostgreSQL环境搭建

安装方式对比

PostgreSQL有多种安装方式,适合不同场景:

安装方式优点缺点推荐场景
系统包管理器简单快速版本可能较旧学习体验
官方安装包版本新配置稍复杂生产环境
Docker隔离性好需要Docker基础开发测试
云服务免运维有成本生产环境

Windows系统安装

  1. 访问 PostgreSQL官方下载页
  2. 下载Windows安装包(约200MB)
  3. 运行安装程序,设置超级用户密码(务必记住!
  4. 安装完成会自动启动pgAdmin管理工具

macOS系统安装

使用Homebrew安装:

bash

brew install postgresql@16
brew services start postgresql@16  # 启动服务

安装完成后,连接数据库:

bash

psql -U postgres

Docker安装(推荐开发者使用)

bash

# 拉取PostgreSQL镜像
docker pull postgres:16

# 启动容器
docker run --name my-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres:16

连接与验证

使用psql命令行连接:

bash

psql -h localhost -U postgres -d mydb

或者使用pgAdmin图形化工具连接管理。

第二部分:SQL基础查询

数据库与表操作

sql

-- 创建数据库
CREATE DATABASE myapp;

-- 切换数据库
\c myapp

-- 创建表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查看表结构
\d users

-- 删除表
DROP TABLE users;

增删改查基础

sql

-- 插入数据
INSERT INTO users (username, email, password_hash) VALUES
    ('alice', 'alice@example.com', 'hash123'),
    ('bob', 'bob@example.com', 'hash456');

-- 查询数据
SELECT * FROM users;
SELECT username, email FROM users WHERE id = 1;

-- 更新数据
UPDATE users SET email = 'newalice@example.com' WHERE id = 1;

-- 删除数据
DELETE FROM users WHERE id = 2;

条件查询与排序

sql

-- WHERE条件
SELECT * FROM users 
WHERE username LIKE 'a%' AND created_at > '2025-01-01';

-- ORDER BY排序
SELECT * FROM products 
ORDER BY price DESC, created_at ASC;

-- LIMIT分页
SELECT * FROM users 
ORDER BY created_at DESC 
LIMIT 10 OFFSET 20;

聚合函数与分组

sql

-- 常用聚合函数
SELECT 
    COUNT(*) as total,
    COUNT(DISTINCT category) as categories,
    AVG(price) as avg_price,
    SUM(stock) as total_stock,
    MIN(created_at) as first_order,
    MAX(created_at) as last_order
FROM products;

-- GROUP BY分组
SELECT 
    category,
    COUNT(*) as count,
    AVG(price) as avg_price
FROM products
GROUP BY category
HAVING COUNT(*) > 5
ORDER BY avg_price DESC;

第三部分:PostgreSQL高级特性

窗口函数——数据分析神器

窗口函数是PostgreSQL最强大的特性之一,它允许你在不分组的情况下计算聚合值:

sql

-- 排名
SELECT 
    name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank,
    DENSE_RANK() OVER (ORDER BY salary DESC) as overall_rank
FROM employees;

-- 计算占比
SELECT 
    product_name,
    sales,
    SUM(sales) OVER () as total_sales,
    ROUND(sales * 100.0 / SUM(sales) OVER (), 2) as percentage
FROM sales;

-- 移动平均
SELECT 
    date,
    revenue,
    AVG(revenue) OVER (
        ORDER BY date 
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) as moving_avg_7d
FROM daily_sales;

JSON数据类型

PostgreSQL支持两种JSON类型:JSON和JSONB。推荐使用JSONB,因为它存储为二进制格式,查询性能更好:

sql

-- 创建JSONB列
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    event_type VARCHAR(50),
    metadata JSONB,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 插入JSON数据
INSERT INTO events (event_type, metadata) VALUES
    ('click', '{"button": "submit", "page": "home", "user_id": 123}'),
    ('purchase', '{"product_id": 456, "amount": 99.9}');

-- 查询JSON字段
SELECT 
    event_type,
    metadata->>'button' as button,
    metadata->>'page' as page
FROM events
WHERE metadata->>'user_id' = '123';

-- 索引JSON字段
CREATE INDEX idx_events_user_id ON events ((metadata->>'user_id'));

全文搜索

PostgreSQL内置全文搜索功能,无需Elasticsearch也能实现高效搜索:

sql

-- 创建全文搜索列
ALTER TABLE articles ADD COLUMN search_vector TSVECTOR;

-- 生成搜索向量
UPDATE articles SET search_vector = 
    to_tsvector('english', title || ' ' || content);

-- 创建GIN索引
CREATE INDEX idx_articles_search ON articles USING GIN(search_vector);

-- 执行搜索
SELECT 
    title,
    ts_rank(search_vector, query) as rank
FROM articles, plainto_tsquery('english', 'rust programming') query
WHERE search_vector @@ query
ORDER BY rank DESC;

数组类型

sql

-- 创建数组列
CREATE TABLE tags (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    synonyms TEXT[]
);

-- 插入数组数据
INSERT INTO tags (name, synonyms) VALUES
    ('rust', ARRAY['rust-lang', 'ferrous']),
    ('web', '{"web开发", "frontend", "backend"}');

-- 查询数组
SELECT * FROM tags WHERE 'rust-lang' = ANY(synonyms);

-- 数组操作
SELECT array_append(synonyms, 'rustacean') FROM tags WHERE name = 'rust';

第四部分:PostgreSQL在AI领域的应用——pgvector向量数据库

这是PostgreSQL在2026年最火热的使用场景。pgvector扩展让PostgreSQL成为向量数据库,可以存储和检索嵌入向量,非常适合语义搜索、推荐系统等AI应用。

安装pgvector

sql

-- 启用扩展
CREATE EXTENSION IF NOT EXISTS vector;

-- 验证安装
SELECT extname, extversion FROM pg_extension WHERE extname = 'vector';

创建向量表

sql

CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    embedding VECTOR(1536)  -- OpenAI text-embedding-3-small的维度
);

-- 创建索引(必须!否则查询很慢)
CREATE INDEX ON documents USING HNSW (embedding vector_cosine_ops);

插入向量数据

sql

-- 插入示例向量(实际使用时需要调用AI API生成真实embedding)
INSERT INTO documents (title, content, embedding) VALUES
    ('Rust教程', 'Rust是一门系统级编程语言...', '[0.1, 0.2, ...]'),
    ('Python教程', 'Python是一门易学的编程语言...', '[0.3, 0.4, ...]');

向量相似度检索

sql

-- 查找最相似的文档(余弦相似度)
SELECT 
    title,
    1 - (embedding <=> '[query_vector]') as similarity
FROM documents
ORDER BY embedding <=> '[query_vector]'
LIMIT 5;

-- 过滤条件 + 向量检索
SELECT 
    title,
    content,
    1 - (embedding <=> '[query_vector]') as similarity
FROM documents
WHERE created_at > '2025-01-01'
ORDER BY embedding <=> '[query_vector]'
LIMIT 3;

实际应用示例:RAG系统

sql

-- 完整的RAG查询示例
WITH query_embedding AS (
    -- 这里应该调用OpenAI API生成查询向量
    SELECT '[user_query_vector]'::vector as embedding
),
relevant_docs AS (
    SELECT 
        d.title,
        d.content,
        1 - (d.embedding <=> q.embedding) as similarity
    FROM documents d, query_embedding q
    WHERE d.embedding <=> q.embedding < 0.5  -- 相似度阈值
    ORDER BY d.embedding <=> q.embedding
    LIMIT 5
)
SELECT 
    string_agg(content, ' ') as context,
    similarity
FROM relevant_docs
GROUP BY similarity;

第五部分:性能优化实战

索引优化

索引是PostgreSQL性能优化的基础,但滥用索引反而会影响写入性能:

sql

-- B-tree索引(默认,最常用)
CREATE INDEX idx_users_email ON users(email);

-- 部分索引(只索引满足条件的行)
CREATE INDEX idx_active_users ON users(last_login)
WHERE is_active = true;

-- 复合索引(多列索引,注意列顺序)
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);

-- 表达式索引
CREATE INDEX idx_users_lower_email ON users(LOWER(email));

-- 重建索引(清理碎片)
REINDEX INDEX idx_users_email;

查询分析

使用EXPLAIN ANALYZE分析查询性能:

sql

EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT * FROM orders
WHERE user_id = 123 AND created_at > '2025-01-01'
ORDER BY created_at DESC
LIMIT 10;

关键指标解读:

  • Seq Scan:全表扫描,应该尽量避免
  • Index Scan / Index Only Scan:使用索引,性能好
  • Bitmap Heap Scan:批量索引扫描,适合大数据量
  • Buffers: shared hit:命中缓存的比例,越高越好

慢查询优化

sql

-- 查看最近最慢的查询
SELECT 
    query,
    calls,
    mean_time,
    total_time,
    rows
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- 开启慢查询日志
ALTER SYSTEM SET log_min_duration_statement = 1000;  -- 超过1秒记录
SELECT pg_reload_conf();

常见优化技巧

sql

-- 1. 使用EXPLAIN而不是EXPLAIN ANALYZE测试索引
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

-- 2. 批量插入使用COPY
COPY users(username, email) FROM '/tmp/users.csv' WITH (FORMAT csv);

-- 3. 使用连接池(PgBouncer)
-- 安装:brew install pgbouncer
-- 配置:pgbouncer.ini
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb

-- 4. 开启并行查询
SET max_parallel_workers_per_gather = 4;

-- 5. 调整缓存
ALTER SYSTEM SET shared_buffers = '4GB';

第六部分:学习路线与资源推荐

分阶段学习计划

第一阶段:入门基础(2-3周)

  • 掌握SQL基础操作(CRUD)
  • 理解关系型数据库概念
  • 完成在线SQL练习(如SQLZoo、LeetCode SQL)
  • 建议时间:2-3周

第二阶段:进阶技能(3-4周)

  • 深入理解事务与锁机制
  • 学习索引原理与优化
  • 掌握窗口函数与CTE
  • 建议时间:3-4周

第三阶段:高级特性(2-3周)

  • 学习JSON、全文搜索、数组类型
  • 理解MVCC与并发控制
  • 掌握pgvector向量检索
  • 建议时间:2-3周

第四阶段:运维管理(持续)

  • 学习备份恢复策略
  • 掌握高可用架构(Patroni)
  • 了解云原生部署(Kubernetes)
  • 建议时间:持续学习

优质学习资源

官方文档

书籍

  • 《PostgreSQL: Up and Running》——O’Reilly经典
  • 《Mastering PostgreSQL in Application Development》
  • 《The Art of PostgreSQL》

在线练习

社区与博客

总结

学习PostgreSQL的过程让我深刻体会到:数据库不只是存储数据的地方,它是应用性能的根基。一个好的数据库设计,可以让应用性能提升10倍甚至100倍。

PostgreSQL在2026年的强大之处,不仅在于它传统的关系型数据处理能力,更在于它与现代技术的结合——pgvector让它成为AI应用的向量数据库,全文搜索让它可以替代Elasticsearch的部分场景,JSON支持让它可以处理半结构化数据。

无论你是想从事后端开发、数据工程还是AI应用,PostgreSQL都是值得深入学习的数据库。从现在开始,跟着教程动手实践,你会发现数据库的世界比想象中更加精彩。

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注