摘要:本文详细对比了 PostgreSQL 和 MySQL 的主要区别,包括功能、性能、使用场景等。同时介绍了 PostgreSQL 中的 schema 概念及其作用,并解释了 pgAdmin 工具中表概况界面各列的含义,以及如何查看表结构和获取 CREATE TABLE 语句。
PostgreSQL 与 MySQL 主要区别
PostgreSQL 和 MySQL 是两种非常流行的开源关系型数据库管理系统(RDBMS),它们在很多方面都有不同的特点和适用场景。
基本定位与设计哲学
特性 |
PostgreSQL |
MySQL |
定位 |
强调功能丰富、可扩展性和标准兼容性 |
强调高性能、易用性和广泛适用性 |
设计哲学 |
面向对象的关系型数据库,支持复杂查询和高级特性 |
更传统的关系型数据库,注重速度和实用性 |
功能对比
PostgreSQL 的优势
- 支持更复杂的 SQL 查询(如窗口函数、CTE、递归查询等)
- 支持 JSONB 数据类型,性能优于 MySQL 的 JSON
- 支持自定义数据类型、操作符、函数、索引方法等
- 支持全文搜索、地理空间数据(通过 PostGIS 插件)
- 强大的事务处理能力,ACID 支持更严格
- 支持并发版本控制(MVCC),读写不阻塞
- 复杂的连接(JOIN)优化更好
MySQL 的优势
- 性能更高(尤其是读操作),适合高并发、低延迟场景
- 架构简单,部署和管理更容易
- 社区庞大,文档丰富,学习曲线相对平缓
- 支持多种存储引擎(如 InnoDB、MyISAM、Memory 等)
- 主从复制、集群架构成熟,适合 Web 应用
- 对 SQL 标准的支持较为宽松,兼容性好但不如 PG 严格
使用场景对比
使用场景 |
推荐数据库 |
复杂查询、分析型应用(OLAP) |
PostgreSQL |
Web 应用、高并发读多写少 |
MySQL |
地理信息系统(GIS) |
PostgreSQL(配合 PostGIS) |
实时数据分析 |
PostgreSQL |
电商、社交类系统 |
MySQL |
需要高度可定制和扩展 |
PostgreSQL |
轻量级应用、快速开发 |
MySQL |
安全性
特性 |
PostgreSQL |
MySQL |
行级安全策略 |
✅ 原生支持 |
❌ 不原生支持 |
角色权限管理 |
更细粒度,支持基于角色的访问控制 |
权限模型较简单 |
SSL/TLS 支持 |
默认支持较好 |
支持,但配置稍复杂 |
扩展性与插件生态
特性 |
PostgreSQL |
MySQL |
自定义函数/触发器 |
✅ 支持多种语言(PL/pgSQL、Python、Perl 等) |
✅ 支持,但灵活性略差 |
插件系统 |
强大,支持大量官方和第三方插件 |
插件较少,依赖存储引擎 |
分布式支持 |
有分布式解决方案(如 Citus) |
有分库分表中间件(如 MyCat、ShardingSphere) |
性能比较
场景 |
PostgreSQL |
MySQL |
写入密集型 |
较慢(但稳定) |
更快(尤其在批量插入) |
读取密集型 |
可优化到接近 MySQL 水平 |
更快 |
复杂查询 |
更强 |
相对较弱 |
并发处理 |
MVCC 机制更强 |
表锁问题已改善(InnoDB) |
数据类型支持
类型 |
PostgreSQL |
MySQL |
JSON 支持 |
✅ JSONB(高效二进制格式) |
✅ JSON(文本解析) |
数组 |
✅ 支持 |
❌ 不支持 |
范围类型 |
✅ 支持(如日期范围、数字范围) |
❌ 不支持 |
自定义类型 |
✅ 支持 |
❌ 不支持 |
时间戳精度 |
更高(微秒级) |
秒或毫秒级 |
事务与一致性
特性 |
PostgreSQL |
MySQL |
ACID 支持 |
✅ 所有操作默认在事务中 |
✅ InnoDB 支持 |
多版本并发控制(MVCC) |
✅ 原生支持 |
❌ InnoDB 有类似机制但非标准 MVCC |
总结建议
如果你关注: |
推荐选择: |
功能强大、标准兼容、复杂查询 |
PostgreSQL |
快速部署、易用性、Web 应用 |
MySQL |
高并发、读多写少 |
MySQL |
GIS、JSON、大数据分析 |
PostgreSQL |
高可用架构、主从复制 |
MySQL 成熟方案更多 |
扩展性强、可定制 |
PostgreSQL |
PostgreSQL 中的 Schema 概念
public 架构是什么?
在 PostgreSQL 中,Schema 是一个命名空间,用来组织数据库对象(如表、视图、函数等)。`public` 是 PostgreSQL 的默认架构,当你创建表时没有指定 schema,就会自动放到 `public` 下。
为什么表要在架构下面?
PostgreSQL 的设计要求所有表必须属于某个 schema,这是为了实现更好的逻辑隔离、权限控制和模块化管理。
示例:创建表并指定 schema
CREATE TABLE public.users (
id SERIAL PRIMARY KEY,
name TEXT
);
-- 或者创建新的 schema 并使用它
CREATE SCHEMA sales;
CREATE TABLE sales.orders (
order_id SERIAL PRIMARY KEY,
amount NUMERIC
);
查看架构和表
\dn -- 查看所有 schema
\dt public.* -- 查看 public 架构下的所有表
为什么要使用多个 schema?
- 逻辑隔离:比如开发、测试、生产环境可以用不同的 schema。
- 权限控制:不同用户或角色可以访问不同的 schema。
- 多租户支持:每个客户的数据可以放在独立的 schema 中。
- 模块化设计:大型项目中,按功能划分 schema,便于维护。
pgAdmin 表概况界面各列含义
列名 |
含义 |
表名 |
表示当前统计信息所对应的表名称。 |
总量 |
表示该表占用的总存储空间大小。 |
元组已插入 |
表示已经成功插入到表中的记录(元组)数量。 |
元组已更新 |
表示已经通过 UPDATE 操作修改过的记录(元组)数量。 |
元组已删除 |
表示已经通过 DELETE 操作标记为删除的记录(元组)数量。 |
元组已热更新 |
表示最近一段时间内被频繁更新的活跃记录(元组)数量。 |
存活元组 |
表示当前表中仍然有效的记录(元组)数量。 |
死亡元组 |
表示已经被标记为删除但尚未被清理的记录(元组)数量。 |
如何查看表结构和获取 CREATE TABLE 语句
方法一:使用图形界面查看表结构
在 pgAdmin 中展开表,右侧标签页显示字段、约束、索引等信息。
方法二:通过“脚本”功能导出 CREATE TABLE 语句
右键点击表 → Script → CREATE Script,会生成完整的 CREATE TABLE 语句。
方法三:使用 SQL 查询获取 CREATE TABLE 语句
SELECT pg_get_tabledef('schema_name.table_name');
方法四:使用备份功能生成建表语句
右键点击表 → Backup → Backup...,设置为 Plain Text,勾选 Only schema。
方法五:SQL 查询表结构
SELECT
column_name,
data_type,
is_nullable,
column_default
FROM
information_schema.columns
WHERE
table_schema = 'public'
AND table_name = 'your_table_name';
总结
方法 |
是否推荐 |
用途 |
图形界面查看结构(Columns/Constraints) |
✅ 推荐 |
快速查看字段、约束等信息 |
右键 → Script → CREATE Script |
✅✅ 强烈推荐 |
获取完整建表语句 |
使用 pg_get_tabledef() 函数 |
✅ 推荐 |
在查询窗口中快速获取建表语句 |
使用备份功能导出结构 |
⭕ 可选 |
适合批量导出多个表或整个 schema 的结构 |
SQL 查询表结构 |
✅ 推荐 |
编写脚本或自动化时很有用 |