说明:标题中的PostgreSQL 16在本文写作时(2023年5月)尚未发布(PostgreSQL 16于2023年9月发布)。

本文基于我使用PostgreSQL三年的经验,分享这些年才明白的道理,包括设计、性能、运维、架构,以及踩过的坑。

一、设计层面的道理

1. 道理一:范式不是越高越好

第一个道理:范式不是越高越好。

  • 刚学数据库的时候
  • 觉得范式越高越好
  • 第三范式、BCNF
  • 觉得不满足就是设计差
  • 用了三年才明白

范式,不是越高越好。

2. 道理二:适当冗余是必要的

第二个道理:适当冗余是必要的。

  • 完全范式化
  • 查询要join很多表
  • 性能差
  • 适当冗余
  • 可以提升性能

冗余,是性能的代价。

3. 道理三:字段设计要考虑未来

第三个道理:字段设计要考虑未来。

  • 刚开始觉得字段够用
  • 后来需求变了
  • 加字段很麻烦
  • 设计时要留有余地
  • 但不要过度设计

字段,要考虑扩展性。

4. 道理四:索引不是越多越好

第四个道理:索引不是越多越好。

  • 刚开始觉得索引越多越好
  • 查询快
  • 但写入慢
  • 占空间
  • 要平衡

索引,是双刃剑。

5. 道理五:主键设计很重要

第五个道理:主键设计很重要。

  • 自增ID
  • UUID
  • 雪花算法
  • 各有优缺点
  • 要根据场景选

主键,是表的根基。

二、性能层面的道理

1. 道理一:慢查询要尽早优化

第一个道理:慢查询要尽早优化。

  • 刚开始数据少
  • 查询都很快
  • 不注意优化
  • 数据多了就慢了
  • 优化成本高了

慢查询,要早优化。

2. 道理二:执行计划是最好的老师

第二个道理:执行计划是最好的老师。

  • EXPLAIN ANALYZE
  • 看执行计划
  • 知道为什么慢
  • 知道怎么优化
  • 是DBA的基本功

执行计划,是优化的指南。

3. 道理三:连接池很重要

第三个道理:连接池很重要。

  • 每个连接都占资源
  • 连接太多数据库会崩
  • 要用连接池
  • PgBouncer
  • 是生产必备

连接池,是稳定性的保障。

4. 道理四:VACUUM不能忽视

第四个道理:VACUUM不能忽视。

  • PostgreSQL的MVCC
  • 会产生死元组
  • 需要VACUUM清理
  • 不清理会膨胀
  • 性能下降

VACUUM,是PostgreSQL的特色。

5. 道理五:批量操作比单条快

第五个道理:批量操作比单条快。

  • 循环单条插入
  • 很慢
  • 批量插入
  • 快很多
  • 要养成习惯

批量,是性能的关键。

三、运维层面的道理

1. 道理一:备份是生命线

第一个道理:备份是生命线。

  • 没有备份
  • 数据丢了就完了
  • 要定期备份
  • 要测试恢复
  • 不能只备份不恢复

备份,是最后的防线。

2. 道理二:监控要完善

第二个道理:监控要完善。

  • 连接数
  • 慢查询
  • 复制延迟
  • 磁盘空间
  • 都要监控

监控,是眼睛。

3. 道理三:升级要谨慎

第三个道理:升级要谨慎。

  • 大版本升级
  • 要测试
  • 要备份
  • 要回滚方案
  • 不能贸然升级

升级,要谨慎。

4. 道理四:参数优化要循序渐进

第四个道理:参数优化要循序渐进。

  • 不要一下子改很多参数
  • 改一个看效果
  • 慢慢调
  • 大部分参数默认就好
  • 不要过度优化

参数优化,要循序渐进。

5. 道理五:日志要分析

第五个道理:日志要分析。

  • 打开慢查询日志
  • 定期分析
  • 发现问题
  • 优化
  • 形成闭环

日志,是优化的依据。

四、架构层面的道理

1. 道理一:读写分离是必要的

第一个道理:读写分离是必要的。

  • 读多写少
  • 读写分离
  • 主库写
  • 从库读
  • 提升性能

读写分离,是扩展的第一步。

2. 道理二:分库分表要慎重

第二个道理:分库分表要慎重。

  • 分库分表很复杂
  • 不要过早分
  • 先优化
  • 实在不行再分
  • 分了就难回头

分库分表,是最后的手段。

3. 道理三:缓存不能代替数据库

第三个道理:缓存不能代替数据库。

  • 缓存是加速
  • 不是持久化
  • 数据库才是权威
  • 缓存可以丢
  • 数据库不能丢

缓存,是辅助。

4. 道理四:不要把所有数据放一个库

第四个道理:不要把所有数据放一个库。

  • 不同业务
  • 不同库
  • 解耦
  • 便于扩展
  • 便于维护

分离,是架构的原则。

5. 道理五:高可用是必须的

第五个道理:高可用是必须的。

  • 主库挂了怎么办
  • 要有从库
  • 要能切换
  • 要自动化
  • 不能手动

高可用,是生产的要求。

五、踩过的坑

1. 坑一:没有备份

第一个坑:没有备份。

  • 刚工作的时候
  • 觉得不会出问题
  • 没做备份
  • 一次误操作
  • 数据丢了
  • 教训深刻

备份,不能少。

2. 坑二:索引没用对

第二个坑:索引没用对。

  • 建了索引
  • 但查询没用到
  • 因为函数操作
  • 因为隐式转换
  • 索引失效

索引,要用对。

3. 坑三:长事务

第三个坑:长事务。

  • 事务开了不提交
  • 锁不释放
  • 其他查询阻塞
  • 数据库卡死
  • 要避免长事务

长事务,是杀手。

4. 坑四:磁盘满了

第四个坑:磁盘满了。

  • 没监控磁盘
  • WAL日志占满
  • 数据库挂了
  • 很被动
  • 要监控

磁盘,要监控。

5. 坑五:连接数打满

第五个坑:连接数打满。

  • 应用没关连接
  • 连接数越来越多
  • 数据库连不上
  • 服务挂了
  • 要用连接池

连接数,要控制。

六、给新手的建议

1. 建议一:打好基础

第一个建议:打好基础。

  • SQL基础
  • 索引原理
  • 事务原理
  • 这些是基础
  • 要扎实

基础,是根本。

2. 建议二:多实践

第二个建议:多实践。

  • 光看书没用
  • 要多动手
  • 建表
  • 写查询
  • 优化

实践,出真知。

3. 建议三:看执行计划

第三个建议:看执行计划。

  • 每个慢查询
  • 都看执行计划
  • 知道为什么慢
  • 知道怎么优化
  • 养成习惯

执行计划,是工具。

4. 建议四:做好备份

第四个建议:做好备份。

  • 不管什么环境
  • 都要备份
  • 要测试恢复
  • 不能只备份不恢复
  • 这是底线

备份,是底线。

5. 建议五:持续学习

第五个建议:持续学习。

  • PostgreSQL在更新
  • 新特性
  • 新工具
  • 要持续学习
  • 不要停止

学习,是终身的。

七、写在最后

用了三年PostgreSQL,我才明白这些道理。

设计层面:范式不是越高越好,适当冗余是必要的,字段设计要考虑未来,索引不是越多越好,主键设计很重要。性能层面:慢查询要尽早优化,执行计划是最好的老师,连接池很重要,VACUUM不能忽视,批量操作比单条快。运维层面:备份是生命线,监控要完善,升级要谨慎,参数优化要循序渐进,日志要分析。架构层面:读写分离是必要的,分库分表要慎重,缓存不能代替数据库,不要把所有数据放一个库,高可用是必须的。

2023年了,PostgreSQL越来越流行,功能越来越强大。但不管工具怎么变,道理是相通的。打好基础,多实践,做好备份,持续学习,你也能成为PostgreSQL高手。

最后,用一句话总结:"数据库,是后端的根基。用了三年才明白的道理,希望你不用三年就明白。打好基础,多实践,少踩坑。"

希望我的经验和教训,能帮到你。