说明:标题中的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高手。
最后,用一句话总结:"数据库,是后端的根基。用了三年才明白的道理,希望你不用三年就明白。打好基础,多实践,少踩坑。"
希望我的经验和教训,能帮到你。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录