我们最讨厌的 PostgreSQL 部分

主要观点:2023 年 4 月有众多数据库可选,互联网会集体决定新应用的默认数据库,近年 PostgreSQL 成为互联网新宠,但它的多版本并发控制(MVCC)存在问题。
关键信息

  • 2000 年代 MySQL 受 Google 和 Facebook 等使用而成为主流,2010 年代 MongoDB 因“webscale”特点受欢迎,近五年 PostgreSQL 受青睐。
  • PostgreSQL 的 MVCC 实现方式在其他广泛使用的关系型数据库管理系统中最差,包括 MySQL、Oracle 和 Microsoft SQL Server,Amazon 的 PostgreSQL Aurora 也存在这些问题。
  • MVCC 的目标是允许多个查询同时读写数据库而不相互干扰,通过维护行的多个版本来实现。
  • PostgreSQL 的 MVCC 方案核心是每次更新行时创建新副本,通过单链表的版本链记录版本 lineage,为避免遍历整个版本链,在索引中为每个行版本添加条目。
  • PostgreSQL 的 MVCC 存在四个问题:版本复制导致数据冗余和存储需求增加;表膨胀导致空间占用大、查询性能下降;二级索引维护导致更新查询变慢和索引锁竞争;真空管理困难导致死元组积累和性能问题。
    重要细节
  • 1978 年 David Reed 的论文描述了 MVCC,1980 年代 InterBase 实现了第一个商业 MVCC 数据库。
  • PostgreSQL 从 1987 年开始设计支持多版本,采用追加式版本存储方案,默认使用 oldest-to-newest(O2N)顺序。
  • 企业数据库的 zheap 项目曾尝试改进 PostgreSQL 的版本存储实现但已停止。
  • PostgreSQL 的真空过程会定期清理死元组,但默认设置可能导致无法及时清理,造成性能问题,如 Uber 因性能问题从 PostgreSQL 切换到 MySQL。
  • OtterTune 正在研究解决 PostgreSQL MVCC 问题的方法,将在后续文章中介绍。
阅读 14
0 条评论