[转]MySQL与PostgreSQL对比

文章出在此处, 这篇文章就像文章摘要一样, 里面的结论也无法保证正确, 需要等后续实践之中来验证.

今后还会收集其他的一些文章补充这篇文章的内容

最近项目之中, 再选型关系型数据库的类型, 之前团队里一直都是用MySQL + MyBatis的方案, 但是其他项目组选型了PostgreSQL, 现在正在考虑是否要迁移数据库系统.

MySQL的优势项

  1. 流行度高, 因此相应的第三方工具会更加齐全
  2. 回滚更好, PG需要定时触发VACUUM, 否则数据可能膨胀
  3. Windows支持好
  4. 线程模式, 相比PG资源利用率高
  5. 用户权限更加完善, PG只有表级权限, 而MySQL支持列权限
  6. 存储引擎插件化, innodb适合事务处理场景外, myisam适合静态数据的查询场景
  7. 24*7小时运行
  8. 支持堆表和索引表, PG只支持堆表

PostgreSQL的优势项

  1. Json和Array格式支持, MySQL5.7版本之后, 也支持JSon, 但是能力略为落后
  2. GIS支持, 一般都用PG
  3. PostgREST提供API能力
  4. 支持树状结构, 例如R-Tree
  5. SQL编程, 使用各种语言来编程, 对标的是MySQL的存储过程
  6. 支持外部数据源, 这儿估计一堆的限制
  7. Text没有长度限制, MySQL需要区分small text, middle text, large text, 但实际上我觉得程序员定义这个长度是比较好的, 就像int和long类型一个意思
  8. 支持图结构数据存储
  9. 支持窗口函数, OVER语句, 没想到MySQL竟然没有支持这个, SparkSQL都实现了
  10. 更多索引类型,
  11. 集群支持更好, 这个点需要存疑, 因为mysql的分布式中间件那么多, 感觉有点不对
  12. 事务隔离做的更好
  13. 对于字符支持更好一些
  14. 对表连接支持较完整, 真的很难相信MySQL不支持HashJoin和SortMergeJoin, 之前数据库确实用的太简单了
  15. 存储方式支持更大的数据量
  16. 时间精度更高
  17. 优化器的功能较完整
  18. 序列支持更好
  19. 对子查询支持更好
  20. 增加列更加简单

两者选择规则

  1. 如果是非常简单的场景, 直接使用MySQL
  2. 如果涉及到数据完整性和可靠性的时候, 使用PG
  3. 如果是地理数据, 使用PG
  4. 如果有嵌入式SQL场景, 使用PG
  5. 如果你想学习一个经典的关系型数据库, 使用PG吧

MyBatis兼容PG和MySQL

如果上层使用了MyBatis的话, MyBatis有个叫做DatabaseIdProvider的能力可以支持多个不同的数据库.

在我们的例子里面, 需要支持MySQL/PG/HSQL三种数据库, 就需要在MyBatis的配置文件, 写在如下配置:

HSQL是本地测试常用的数据库

1
2
3
4
5
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="PostgreSQL" value="postgresql" />
<property name="HSQL" value="hsqldb" />
</databaseIdProvider>

在具体的查询语句的配置项文件里面, 可以使用如下配置

1
2
3
4
5
6
7
8
9
10
11
<choose>
<when test="_databaseId == 'postgresql'">
LIMIT #{pageSize} OFFSET #{offset};
</when>
<when test="_databaseId == 'mysql'">
LIMIT #{offset}, #{pageSize};
</when>
<otherwise>
LIMIT #{offset}, #{pageSize};
</otherwise>
</choose>

在这个例子里面, PG和MySQL的Limit语法不同, 因此根据不同情况来生成不同的SQL语句.

在这儿使用的是MyBatis里面的choose-when-otherwise的语法, 这个语法含义和Java中的match含义类似

在每个when中判断内置的DatabaseIdProvider字段_databaseId是否为PG或者MySQL, 这儿的字符串mysqlpostgresql就是在databaseIdProvider定义的那个两个数据库