最近开始学习PostgreSQL,正好赶上14版本的beta测试。PostgreSQL是一个功能非常强大的开源关系型数据库,被称为"开源界的Oracle"。但它的功能太多,初学者很容易迷失。本文分享我的学习路线和心得体会,帮你快速入门这个强大的数据库。

一、为什么学PostgreSQL

我之前主要用MySQL,工作中也一直是MySQL。但越来越多的项目开始用PostgreSQL,而且PG的很多特性是MySQL没有的,比如JSON支持、全文搜索、地理信息、复杂查询等。

正好PG 14要发布了,有一些令人期待的新特性,比如性能提升、JSON语法简化、多并发连接优化等。我决定趁这个机会系统学习一下PostgreSQL。

二、学习路线总览

我的学习路线分为五个阶段,从基础到进阶,循序渐进:

  1. 安装和基本操作:安装PG,熟悉客户端工具,创建数据库和表
  2. SQL基础:SELECT/INSERT/UPDATE/DELETE,条件查询,排序分组,连接查询
  3. 数据类型和约束:PG特有的数据类型,主键、外键、唯一约束等
  4. 高级特性:索引、视图、事务、存储过程、触发器
  5. 性能优化和运维:查询优化、索引优化、备份恢复、高可用

每个阶段我都花了一到两周时间,边学边练,大概两个月时间入门。

三、第一阶段:安装和基本操作

1. 安装。 PostgreSQL的安装很简单,官网有各平台的安装包。Windows下直接下载安装包,下一步下一步就装好了。安装过程中会让你设置超级用户postgres的密码,一定要记住。

安装完成后,会自带一个图形化工具pgAdmin,也可以用命令行工具psql。我建议初学者先用pgAdmin,可视化操作比较友好,熟悉之后再用命令行。

2. 基本操作。 安装好之后,先熟悉基本操作:

  • 创建数据库:CREATE DATABASE mydb;
  • 连接数据库:\c mydb
  • 创建表:CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100));
  • 查看表:\d users
  • 删除表:DROP TABLE users;

这些操作和MySQL差不多,有SQL基础的人很快就能上手。

3. 客户端工具。 除了pgAdmin,还有很多好用的客户端工具,比如DBeaver、DataGrip、Navicat等。我用的是DBeaver,免费开源,支持多种数据库,界面也不错。

四、第二阶段:SQL基础

PostgreSQL的SQL语法和标准SQL很接近,大部分语法和MySQL一样,但也有一些区别。

1. 基本查询。 SELECT、WHERE、ORDER BY、LIMIT这些都一样。需要注意的是,PG的字符串区分大小写,而MySQL默认不区分。

2. 聚合和分组。 GROUP BY、HAVING、COUNT、SUM、AVG这些也都一样。PG对GROUP BY的要求更严格,SELECT中的非聚合列必须出现在GROUP BY中,MySQL在这方面比较宽松。

3. 连接查询。 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN都支持。PG还支持一些特殊的连接,比如CROSS JOIN、NATURAL JOIN。

4. 子查询和CTE。 PG对子查询的支持很好,尤其是CTE(公共表表达式),可以写非常复杂的查询。WITH语法可以把复杂查询拆分成多个步骤,可读性很好。

5. 窗口函数。 这是PG的强项,窗口函数可以做很多复杂的统计分析,比如ROW_NUMBER、RANK、LAG、LEAD等。MySQL 8.0之后也支持窗口函数了,但PG的支持更早更完善。

五、第三阶段:数据类型和约束

PostgreSQL的数据类型非常丰富,这是它的一大特色。

1. 基本类型。 整数、浮点数、字符串、日期时间这些和MySQL差不多。需要注意的是,PG没有TINYINT、MEDIUMINT,只有SMALLINT、INTEGER、BIGINT。

2. JSON类型。 PG有两种JSON类型:json和jsonb。json是原始文本,jsonb是解析后的二进制格式,支持索引,查询更快。一般推荐用jsonb。PG的JSON功能非常强大,可以做很多文档数据库的事情。

3. 数组类型。 PG支持数组类型,可以在一个字段里存多个值。比如text[]就是字符串数组。可以用数组操作符和函数来操作,非常方便。

4. 范围类型。 PG支持范围类型,比如int4range、tsrange等,可以表示一个数值范围或时间范围。这在做时间段查询、区间判断的时候特别好用。

5. 几何类型。 PG内置了几何类型,比如点、线、圆、多边形等,可以做空间计算。如果需要更强大的地理信息功能,可以安装PostGIS扩展。

6. 约束。 PG的约束很完善,主键、外键、唯一、非空、检查约束都支持。外键的行为可以设置级联删除、级联更新等,比MySQL更灵活。

六、第四阶段:高级特性

学到这里,你已经可以用PG做大部分事情了。接下来学习一些高级特性。

1. 索引。 PG支持多种索引类型:B-tree、Hash、GiST、SP-GiST、GIN、BRIN。不同的索引适用于不同的场景。比如B-tree适合等值和范围查询,GIN适合数组和JSON,GiST适合全文搜索和地理数据。

2. 视图。 视图是虚拟表,可以简化复杂查询。PG还支持物化视图,会把查询结果物理存储,查询更快,但需要手动刷新。

3. 事务。 PG的事务支持很完善,支持ACID,支持保存点,支持事务隔离级别。PG的默认隔离级别是读已提交,可以设置为可重复读或可串行化。

4. 存储过程和函数。 PG支持多种过程语言,最常用的是PL/pgSQL,类似于Oracle的PL/SQL。可以写存储过程、函数、触发器。PG 11之后支持存储过程,之前只有函数。

5. 触发器。 触发器可以在INSERT/UPDATE/DELETE之前或之后执行自定义逻辑。PG的触发器功能很强,可以写行级触发器和语句级触发器。

6. 扩展。 PG的扩展机制非常强大,可以通过安装扩展来增加功能。比如PostGIS(地理信息)、pgtrgm(模糊搜索)、uuid-ossp(UUID生成)、pgstat_statements(性能统计)等。

七、第五阶段:性能优化和运维

入门之后,就需要学习性能优化和运维了。

1. 查询优化。 用EXPLAIN ANALYZE查看执行计划,分析查询慢在哪里。常见的优化手段包括加索引、优化SQL语句、避免全表扫描、减少子查询等。

2. 索引优化。 索引不是越多越好,索引会增加写入开销。要根据查询模式来设计索引,定期检查无用索引并删除。

3. 配置优化。 PG的默认配置比较保守,需要根据服务器硬件来调整。重要的配置包括sharedbuffers、workmem、maintenanceworkmem、effectivecachesize等。

4. 备份恢复。 PG有多种备份方式:pg_dump逻辑备份、文件系统级备份、PITR时间点恢复。生产环境一定要有备份策略,定期测试恢复。

5. 高可用。 PG的高可用方案有很多,比如流复制、Patroni、pgautofailover等。可以根据需求选择合适的方案。

八、学习资源推荐

1. 官方文档。 PostgreSQL的官方文档非常详细,是最好的学习资料。虽然是英文的,但写得很清楚,建议多读。

2. 《PostgreSQL实战》。 这本书比较新,覆盖了PG的主要特性,有很多实战案例,适合有一定基础的人。

3. 《PostgreSQL指南:内幕探索》。 这本书深入讲解了PG的内部原理,适合想深入理解PG的人。

4. 在线教程。 网上有很多免费的PG教程,比如PostgreSQL Tutorial、菜鸟教程等,可以快速入门。

5. 社区。 PG社区很活跃,遇到问题可以在邮件列表、Stack Overflow、中文社区提问。

九、学习中的建议

  1. 多动手。 数据库是实践性很强的技术,光看不练没用。边学边写SQL,自己建表、写查询、做实验。
  2. 对比MySQL。 如果你之前用MySQL,可以对比着学,注意两者的区别和各自的优势。
  3. 读执行计划。 学会看EXPLAIN的输出,这是性能优化的基础。
  4. 关注新版本。 PG每个大版本都有很多改进,关注新版本的特性,保持学习。
  5. 不要贪多。 PG的功能太多,不可能一次全部学会。先掌握核心功能,需要的时候再学高级特性。

十、写在最后

PostgreSQL是一个非常优秀的数据库,功能强大、性能稳定、社区活跃。虽然学习曲线比MySQL陡一点,但学会之后会发现它能做很多MySQL做不到的事情。

我的学习路线不一定适合所有人,但核心思路是对的:从基础开始,循序渐进,多动手实践。只要坚持学习,两个月就能入门,半年就能熟练使用。

如果你也在考虑学习PostgreSQL,希望我的经验能帮到你。数据库是后端开发的核心技能,多掌握一个强大的数据库,你的技术栈就更完整,职业发展也会更有竞争力。