开源数据库

一般提到常用的开源数据库总会想到 MySQL 与 PostgreSQL,它们都是免费、开源、强大、且功能丰富的数据库。

MySQL

首度出现在1994年,它最初是由 MySQL AB 开发的,然后在 2008 年以 10 亿美金卖给了 Sun 公司,Sun 公司又在 2010 年被 Oracle 收购,Oracle 支持 MySQL 的多个版本:Standard、Enterprise、Classic、Cluster、Embedded 与 Community,其中有的免费有的收费,后来 MySQL 一个创始人又开发了他自己的 MySQL 分支 MariaDB,它是免费的,使用GPL协议。

MySQL 就是 LAMP(用于 Web 开发的软件包,包括 Linux、Apache 及 Perl/PHP/Python)中的 M,一开始并不支持ACID,后来不断发展通过 InnoDB 引擎实现了 ACID,MySQL 还可以用 MEMORY 存储引擎,实现临时表的功能,通过 MyISAM 引擎实现高速读取的数据库,此外还有其他的核心存储引擎与第三方引擎,MySQL 通常被认为是针对网站与应用的快速数据库后端,能够进行快速的读取和大量的查询操作,不过在复杂特性与数据完整性检查方面不太尽如人意。

在诸多引擎中,MyISAM 引擎是最快的,因为它只执行很少的数据完整性检查,适合于后端读操作较多的站点,不过对于包含敏感数据的读 / 写数据库来说就是个灾难了,因为 MyISAM 表最终可能会损坏,MySQL 提供了修复 MySQL 表的工具,不过对于敏感数据来说,支持 ACID 特性的 InnoDB 则是个更好的选择。

MySQL 在一个领域上要比 PostgreSQL 更进一步,那就是它的触角延伸到了嵌入式领域,这是通过 libmysqld 实现的;PostgreSQL 不支持嵌入式应用,依然坚守在传统的客户端 / 服务器架构上。

PostgreSQL

最初是 1985 年在加利福尼亚大学伯克利分校开发的,作为 Ingres 数据库的后继,完全由社区驱动的开源项目,由全世界超过 1000 名贡献者所维护,它提供了单个完整功能的版本,不像 MySQL 那样提供多个不同版本,使用 BSD/MIT 协议,它以可靠性闻名,支持高事务、任务关键型应用,PostgreSQL 完全支持 ACID 特性,它对于数据库访问提供了强大的安全性保证,充分利用了企业安全工具,如 Kerberos 与 OpenSSL 等,在管理特性中还提供了几个方法来管理 PostgreSQL 以实现高可用、负载均衡与复制等,这样可以根据特性需求来选择功能。

PostgreSQL 是针对事务型企业应用的严肃、功能完善的数据库,支持强 ACID 特性和很多数据完整性检查,性能上可以通过调整 postgresql.conf 文件的参数来改进,也可以调整查询与事务。

一些区别(持续收集)

  1. MySQL里schema和database是一个含义;但是PostgreSQL里一个database可以包含多个schema,一个schema又可以包含多个表,逻辑上一个数据表的完整路径是database.schema.table,如果没指明schema默认为public
  2. MySQL的各种text字段有不同的限制,需要手动区分small text,middle text,large text;pg没有该限制,可以支持text的各种大小
  3. 按照SQL标准,null判断只能用is null,不能用 ==null;pg可以设置transform_null_equals 把 = null 翻译成 is null 避免踩坑
  4. MySQL 的事务隔离级别 repeatable read 并不能阻止常见的并发更新, 得加锁才可以,但悲观锁会影响性能,手动实现乐观锁又复杂;而 PostgreSQL 的列里有隐藏的乐观锁 version 字段,默认的 repeatable read 级别就能保证并发更新的正确性,并且又有乐观锁的性能
  5. MySQL 不支持多个表从同一个序列中取 id;而 PostgreSQL 可以
  6. MySQL 不支持 OVER 子句,PostgreSQL 支持,OVER 子句能简单的解决 “每组取 top 5” 的这类问题,几乎任何数据库的子查询 (subquery) 性能都比 MySQL 好
  7. PostgreSQL 可以存储 array 和 json,可以在 array 和 json 上建索引,甚至还能用表达式索引,为了实现文档数据库的功能,设计了 jsonb 的存储结构。有人会说为什么不用 Mongodb 的 BSON,PostgreSQL 的开发团队曾经考虑过,但是他们看到 BSON 把 [“a”, “b”, “c”] 存成 {0: “a”, 1: “b”, 2: “c”} 的时候就决定要重新做一个 jsonb 了,现在 jsonb 的性能已经优于 BSON

参考:

MySQL vs PostgreSQL

postgreSQL与MySQL的比较

PostgreSQL基础管理知识总结