PostgreSQL(下面简称PG)最近受关注程度逐渐增高,更多人拿它与MySQL做对比,此文目帮助大家熟悉下两个数据库功能特点大家根据自己业务场景选择到底使用哪个数据库
MySQL为多线程架构后台有多个线程处理内部操作例如:刷脏、Undo purge、checkpoint等,整体上MySQL分为两层Server/存储引擎。存储引擎层可支持多种,Server层负责接收请求对于每个请求创建新的线程,同时SQL解析、查询优化、复制都是在Server处理。
PG则是多进程结构能更充分利用多CPU完成并行查询、DDL,PG中也有对应后台进程负责处理垃圾回收、Checkpoint、WAL日志。每个新请求连接都会连接到postgres主进程,随后postgres会为每一个新请求fork子进程,对于短连接高并发应用频繁fork进程还是有一定消耗通常需要添加连接池。
MySQL与PG都具有逻辑与物理备份工具
PG中具有FDW功能可以访问远程异构数据库,也支持PG写入同步到远程,这点可以方便解决两个数据库之间数据同步问题。 MySQL中可模拟Slave线程连接到主库上解析Binlog日志放入Kafka,通过程序方式在Kafka中消费放入到不同数据库中
分布式方案中我们最关心是对复杂SQL的支持和分布式事务的强一致性,这两点基于MySQL协议的Tidb和修改了PG代码的PGXC做到了,PG中可以基于FDW做分布式方案,好处在于路由节点是完整的数据库支持所有复杂SQL查询,并且不会改动内核代码随着版本升级不会太费心,会跟随新版本数据库所有新功能。
两类数据库都有比较好的工具提供给我们学习研究数据库内部原理,PG、MySQL中有相应工具可以解析WAL日志、解析数据文件、解析索引结构并且源码也都是开放,但PG工具更开放一些,给大家提供一些工具: 解析PG WAL日志:安装PG后自带的pg_waldump 查看PG页结构内容:PG源码目录下contrib/pageinspect 解析PG数据文件:
https://github.com/ChristophBerg/pg_filedump
如何选择两种数据库大家根据自己的业务来定,如果业务场景是单点高并发查询把数据库就当做存储访问来用那么MySQL更适合,但业务复杂尤其是Oracle迁移过来的引用具有很多存储过程、触发器、函数,有很多业务逻辑是放在数据库中那PG会比较合适