[转]MySQL与PostgreSQL对比
文章出在此处, 这篇文章就像文章摘要一样, 里面的结论也无法保证正确, 需要等后续实践之中来验证.
今后还会收集其他的一些文章补充这篇文章的内容
最近项目之中, 再选型关系型数据库的类型, 之前团队里一直都是用MySQL + MyBatis的方案, 但是其他项目组选型了PostgreSQL, 现在正在考虑是否要迁移数据库系统.
MySQL的优势项
- 流行度高, 因此相应的第三方工具会更加齐全
- 回滚更好, PG需要定时触发VACUUM, 否则数据可能膨胀
- Windows支持好
- 线程模式, 相比PG资源利用率高
- 用户权限更加完善, PG只有表级权限, 而MySQL支持列权限
- 存储引擎插件化, innodb适合事务处理场景外, myisam适合静态数据的查询场景
- 24*7小时运行
- 支持堆表和索引表, PG只支持堆表
PostgreSQL的优势项
- Json和Array格式支持, MySQL5.7版本之后, 也支持JSon, 但是能力略为落后
- GIS支持, 一般都用PG
- PostgREST提供API能力
- 支持树状结构, 例如R-Tree
- SQL编程, 使用各种语言来编程, 对标的是MySQL的存储过程
- 支持外部数据源, 这儿估计一堆的限制
- Text没有长度限制, MySQL需要区分small text, middle text, large text, 但实际上我觉得程序员定义这个长度是比较好的, 就像int和long类型一个意思
- 支持图结构数据存储
- 支持窗口函数, OVER语句, 没想到MySQL竟然没有支持这个, SparkSQL都实现了
- 更多索引类型,
- 集群支持更好, 这个点需要存疑, 因为mysql的分布式中间件那么多, 感觉有点不对
- 事务隔离做的更好
- 对于字符支持更好一些
- 对表连接支持较完整, 真的很难相信MySQL不支持HashJoin和SortMergeJoin, 之前数据库确实用的太简单了
- 存储方式支持更大的数据量
- 时间精度更高
- 优化器的功能较完整
- 序列支持更好
- 对子查询支持更好
- 增加列更加简单
两者选择规则
- 如果是非常简单的场景, 直接使用MySQL
- 如果涉及到数据完整性和可靠性的时候, 使用PG
- 如果是地理数据, 使用PG
- 如果有嵌入式SQL场景, 使用PG
- 如果你想学习一个经典的关系型数据库, 使用PG吧
MyBatis兼容PG和MySQL
如果上层使用了MyBatis的话, MyBatis有个叫做DatabaseIdProvider
的能力可以支持多个不同的数据库.
在我们的例子里面, 需要支持MySQL/PG/HSQL三种数据库, 就需要在MyBatis的配置文件, 写在如下配置:
HSQL是本地测试常用的数据库
1 | <databaseIdProvider type="DB_VENDOR"> |
在具体的查询语句的配置项文件里面, 可以使用如下配置
1 | <choose> |
在这个例子里面, PG和MySQL的Limit语法不同, 因此根据不同情况来生成不同的SQL语句.
在这儿使用的是MyBatis里面的choose-when-otherwise
的语法, 这个语法含义和Java中的match
含义类似
在每个when
中判断内置的DatabaseIdProvider
字段_databaseId
是否为PG或者MySQL, 这儿的字符串mysql
和postgresql
就是在databaseIdProvider
定义的那个两个数据库