从 MySQL 过渡到 PostgreSQL 学习计划(暂定)
从 MySQL 过渡到 PostgreSQL 是一个平滑且有价值的过程,两者同属关系型数据库,但 PostgreSQL 功能更丰富、标准兼容性更强。以下是结合你的基础设计的循序渐进学习计划,包含必备知识和阶段目标:
一、先明确 MySQL 与 PostgreSQL 的核心差异(1-2 天)
作为有 MySQL 基础的学习者,先抓住两者的核心区别,避免思维定式:
数据类型:PostgreSQL 支持更多复杂类型(如数组、JSON/JSONB、地理信息类型、枚举类型等),而 MySQL 的类型相对基础。
事务与锁:PostgreSQL 完全支持 ACID,锁机制更精细(行级锁、表级锁、 advisory lock 等),MySQL 的 InnoDB 虽也支持,但细节有差异。
SQL 标准兼容性:PostgreSQL 更贴近 SQL 标准,支持更多高级语法(如 WITH RECURSIVE 递归查询、MERGE 语句等)。
函数与存储过程:PostgreSQL 的 PL/pgSQL 功能更强,支持更多编程语言(如 Python、Perl 作为存储过程语言),而 MySQL 的存储过程功能较简单。
索引类型:PostgreSQL 支持 B-tree、Hash、GiST、GIN 等更多索引类型(尤其适合 JSON、数组等类型),MySQL 以 B-tree 为主。
扩展性:PostgreSQL 可通过插件扩展(如 PostGIS 地理信息插件),MySQL 扩展能力较弱。
学习方式:快速浏览 PostgreSQL 官方文档的「MySQL 兼容性」章节,或搜索「MySQL 与 PostgreSQL 区别」总结笔记。
二、搭建环境与基础操作(3-5 天)
- 环境搭建
安装 PostgreSQL:推荐用官方安装包(PostgreSQL 官网),或 Docker 快速部署(docker run --name pg -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres)。
客户端工具:pgAdmin(官方图形化工具,类似 MySQL Workbench)、DBeaver(跨数据库工具,支持 MySQL 和 PostgreSQL,上手快)。 - 基础操作(对比 MySQL 记忆)
连接数据库:psql -U 用户名 -d 数据库名 -h 主机(类似 MySQL 的 mysql -u 用户名 -p)。
数据库 / 表操作:
创建数据库:CREATE DATABASE dbname;(与 MySQL 相同)。
创建表:语法类似,但注意数据类型差异(如 SERIAL 替代 MySQL 的 AUTO_INCREMENT,VARCHAR 无需指定长度默认无限长等)。
插入 / 查询 / 更新 / 删除:基本 SQL 语法一致,快速过一遍即可。
用户与权限:PostgreSQL 的权限管理更细,学习 CREATE ROLE、GRANT、REVOKE(比 MySQL 的 GRANT 功能更多,支持列级权限、角色继承等)。
练习:用 PostgreSQL 复现你熟悉的 MySQL 表结构(如用户表、订单表),对比两者的建表语句差异。
三、PostgreSQL 核心特性深入学习(2-3 周)
这部分是 PostgreSQL 的「加分项」,也是与 MySQL 差异最大的地方,需重点掌握: - 高级数据类型(3-4 天)
数组类型:int[]、varchar[] 等,支持数组操作(ARRAY[] 定义、ANY/ALL 查询、数组函数)。
示例:SELECT * FROM users WHERE tags @> ARRAY[‘java’];(查询包含 ‘java’ 标签的用户)。
JSON/JSONB:JSONB 是二进制存储的 JSON,支持索引和高效查询(比 MySQL 的 JSON 功能更强)。
示例:SELECT data->>‘name’ FROM json_table WHERE data @> ‘{“age”: 30}’::jsonb;。
其他类型:枚举(ENUM)、范围(int4range)、地理信息(point、polygon,需结合 PostGIS 插件)。
练习:设计一个包含数组和 JSONB 字段的表(如文章表,用数组存标签,JSONB 存多语言标题),并编写查询语句。 - 高级查询(4-5 天)
WITH 子句(CTE):比 MySQL 更早支持,可用于复杂查询拆分,支持递归(WITH RECURSIVE,如查询部门层级关系)。
示例:递归查询树形结构(部门表 parent_id 关联)。
窗口函数:ROW_NUMBER()、RANK()、SUM() OVER (PARTITION BY …) 等,比 MySQL 更完善(MySQL 8.0 才支持部分)。
示例:查询每个分类下销量前 3 的商品。
全文搜索:内置全文搜索功能(无需依赖 Elasticsearch),学习 to_tsvector、to_tsquery、ts_rank。
示例:SELECT title FROM articles WHERE to_tsvector(‘english’, content) @@ to_tsquery(‘database & postgresql’);。
练习:用窗口函数实现排行榜功能,用递归 CTE 处理树形数据(如评论的多级回复)。 - 函数与存储过程(3-4 天)
PL/pgSQL:PostgreSQL 的默认存储过程语言,语法类似 Oracle PL/SQL,支持条件、循环、异常处理。
示例:创建一个计算订单总额的函数,包含参数和返回值。
自定义函数:支持用 SQL 或 PL/pgSQL 编写,可返回表、标量等(比 MySQL 的函数更灵活)。
触发器:与 MySQL 类似,但触发时机和功能更丰富(如 BEFORE INSERT 中修改字段值)。
练习:编写一个触发器,在插入用户时自动生成唯一邀请码(结合 uuid-ossp 插件)。 - 索引与性能优化(3-4 天)
索引类型:除了 B-tree,重点学习 GIN(适合数组、JSONB)、GiST(适合地理信息、全文搜索)索引。
示例:为 JSONB 字段创建 GIN 索引:CREATE INDEX idx_json ON table USING GIN (data);。
执行计划:用 EXPLAIN ANALYZE 分析查询性能(类似 MySQL 的 EXPLAIN,但输出更详细)。
分区表:PostgreSQL 支持范围分区、列表分区(比 MySQL 的分区表更稳定)。
练习:对之前的 JSONB 表添加索引,对比查询性能差异;用 EXPLAIN ANALYZE 优化一条慢查询。
四、实战与工具链(1-2 周) - 结合应用开发(5-7 天)
用你熟悉的编程语言(如 Python、Java)连接 PostgreSQL:
Python:psycopg2 库(注意参数化查询防止注入,与 MySQL 的 pymysql 类似)。
Java:JDBC 驱动(postgresql JDBC),与 MySQL JDBC 用法差异小。
实现一个小项目:如博客系统(用数组存标签、JSONB 存配置、窗口函数做热门文章排序)。 - 管理与运维工具
备份恢复:pg_dump(类似 mysqldump)、pg_restore。
监控:pg_stat_statements 插件(分析慢查询)、pg_top。
扩展插件:尝试安装 PostGIS(地理信息)、pgcrypto(加密)等插件,体验扩展性。
五、进阶与深入(长期)
事务与并发:深入学习 PostgreSQL 的 MVCC(多版本并发控制)机制,理解隔离级别(与 MySQL InnoDB 的差异)。
源码与内核:若有兴趣,可阅读 PostgreSQL 源码解析(适合进阶)。
分布式方案:了解 Citus(PostgreSQL 分布式扩展),对比 MySQL 的分库分表方案。
必备知识补充
SQL 标准:PostgreSQL 更贴近标准,可简单回顾 SQL 92/99 标准中的高级特性(如 CTE、窗口函数)。
Linux 基础:PostgreSQL 常用在 Linux 环境,了解基本的服务管理(systemctl)、日志查看即可。
学习资源推荐
官方文档:PostgreSQL 中文文档(最权威,建议常备)。
书籍:《PostgreSQL 实战》(入门到进阶)、《PostgreSQL 11 Administration Cookbook》(运维向)。
视频:B 站「PostgreSQL 入门到精通」(适合边看边练)。
按这个计划学习,1-2 个月可掌握 PostgreSQL 核心用法,3-6 个月能熟练应对开发和优化场景。重点是多对比 MySQL 的差异,用实战项目巩固知识点,遇到问题多查官方文档(PostgreSQL 文档非常详细)。
