架构与数据类型

返回 PostgreSQL

命令速查见 基础命令


与 MySQL 核心对比

维度MySQLPostgreSQL
事务隔离默认级别REPEATABLE READREAD COMMITTED
JSON 支持JSON(文本存储)JSONB(二进制,可索引)
数组类型不支持原生支持
全文搜索FULLTEXT 索引(较弱)内置强大全文搜索
窗口函数8.0+ 支持支持,更完善
CTE / 递归查询8.0+ 支持支持,更完善
并发控制MVCC + 锁纯 MVCC,读不阻塞写
扩展性插件较少丰富扩展(PostGIS、pgvector 等)
适用场景互联网高并发读写复杂查询、数据分析、GIS

PostgreSQL 特有 / 增强类型

类型说明
SERIAL / BIGSERIAL自增整数,等价于 INT + SEQUENCE
UUID原生 UUID 类型
JSONB二进制 JSON,支持索引,推荐使用
JSON文本 JSON,保留原始格式,不支持索引
ARRAY任意类型的数组,如 INT[]TEXT[]
INTERVAL时间间隔,如 '2 hours 30 minutes'
INET / CIDRIP 地址类型
TSVECTOR全文搜索文档类型
TSQUERY全文搜索查询类型

JSONB 示例

CREATE TABLE products (
    id    SERIAL PRIMARY KEY,
    name  TEXT,
    attrs JSONB
);
 
INSERT INTO products (name, attrs)
VALUES ('手机', '{"brand": "Apple", "color": "black", "storage": 256}');
 
-- 取值(->> 返回文本)
SELECT attrs->>'brand' FROM products;
 
-- 条件查询(走 GIN 索引)
SELECT * FROM products WHERE attrs @> '{"brand": "Apple"}';
 
-- 更新某个字段
UPDATE products SET attrs = attrs || '{"storage": 512}' WHERE id = 1;

索引:索引(GIN on JSONB)。


数组示例

CREATE TABLE posts (
    id   SERIAL PRIMARY KEY,
    tags TEXT[]
);
 
INSERT INTO posts (tags) VALUES ('{java, spring, mybatis}');
 
-- 查包含某个 tag 的帖子
SELECT * FROM posts WHERE 'java' = ANY(tags);
 
-- 查同时包含多个 tag
SELECT * FROM posts WHERE tags @> ARRAY['java', 'spring'];

相关