在建立一个新项目时,尤其是在 Web 上的项目,选择数据库管理系统通常是事后才想到的。 大多数框架都包含一个对象关系映射 (ORM) 工具,该工具隐藏了跨平台的差异并使它们都以相同的速度运行。
使用默认选项(在大多数情况下,MySQL)很少是一个坏主意,但值得考虑。 不要沉迷于熟悉和舒适——一个聪明的开发人员必须不断地根据许多可能性、它们的优点和缺点做出有根据的选择。
MySQL 一直以来都是用于读取密集型工作负载和闪电般快速的数据库,但在与写入操作配对时,通常会以牺牲并发性为代价。
PostgreSQL,有时也称为 Postgres,自称是“世界上最先进的开源关系数据库”。 它被设计为功能丰富、可扩展且符合行业标准。 过去,Postgres 的性能更加平衡:读取速度比 MySQL 慢,但它可以更快地写入大量数据并更好地管理并发性。
在最近的版本中,MySQL 和 Postgres 之间的性能差异已基本消除。 MySQL 仍然可以快速读取数据,但前提是使用旧的 MyISAM 引擎。 使用 InnoDB(支持事务、密钥限制和其他关键特性)(如果它们甚至存在的话)时差异是微不足道的。
使用旧引擎不是一种选择,因为这些功能对于商业或消费者规模的应用程序至关重要。 另一方面,MySQL 已被调整以缩小在海量数据写入方面的差距。
对于大多数常见的应用程序,在决定 MySQL 和 PostgreSQL 时,性能不应该是考虑因素——这两种情况都足够了,即使考虑到预测的未来扩展。 这两种技术都能够复制,许多云提供商都提供了这两种技术的托管扩展版本。 因此,在使用默认数据库选项开始下一个项目之前,请考虑 Postgres 相对于 MySQL 的各种优势。
MySQL 是一个完全关系型数据库,而 Postgres 是一个对象关系型数据库。 这意味着 Postgres 具有表继承和函数重载等功能,这些功能在某些应用程序中很有用。 Postgres 也更符合 SQL 标准。
由于各种原因,Postgres 比 MySQL 更好地管理并发:
没有读锁,Postgres 支持多版本并发控制 (MVCC)。 Postgres 允许并行利用许多 CPU/内核的查询策略。 Postgres 可以生成非阻塞索引(使用 CREATE INDEX CONCURRENTLY 语法),以及部分索引(例如,如果你有一个带有软删除的模型,你可以创建一个忽略标记为已删除的记录的索引) Postgres 很好—— 以其事务级数据完整性保护而闻名。 因此,它不太容易受到数据损坏的影响。
Postgres 的默认安装通常优于 MySQL 的默认安装(但您可以调整 MySQL 来弥补)。 MySQL 的默认设置有点奇怪(例如,对于字符编码和排序规则)。
Postgres 是一个非常可扩展的数据库。 它具有 MySQL 没有的各种复杂数据类型(几何/GIS、网络地址类型、索引 JSONB、本机 UUID、时区感知时间戳等)。 如果这还不够,您甚至可以添加自己的数据类型、运算符和索引类型。
虽然 MySQL 遇到了一些许可证问题,但 Postgres 是完全开源和社区驱动的。 它最初是一个商业产品(有免费和付费版本),而甲骨文在 2010 年收购 MySQL AB 已经引起了一些开发人员对其未来开源状态的担忧。 但是,由于原始 MySQL 有多个开源分支(MariaDB、Percona 等),因此目前这并不被视为重大危险。
尽管有所有这些好处,但您应该注意使用 Postgres 的一些小缺点。
Postgres 仍然不如 MySQL 受欢迎(尽管最近有所进步),因此可用的第三方工具和数据库开发人员/管理员较少。
对于每个新的客户端连接,Postgres 都会创建一个分配大量 RAM(大约 10 MB)的新进程。
可扩展性、标准合规性、可扩展性和数据完整性都是 Postgres 的优先事项,通常会牺牲性能。 因此,对于简单、读取量大的工作流程,Postgres 可能是比 MySQL 更糟糕的选择。
这些只是开发人员在选择数据库时应该考虑的一些事情。 此外,您的平台提供商可能有偏好; 例如,Heroku 喜欢 Postgres,并在使用它时提供运营优势。 您的框架还可以通过提供卓越的驱动程序来支持其中一个。 您的员工一如既往地可能有意见!