PostgreSQL 与 MySQL 区别及表结构相关知识总结

学习笔记作者:admin日期:2025-07-27点击:15

摘要:本文详细对比了 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 查询表结构 ✅ 推荐 编写脚本或自动化时很有用

上一篇      下一篇