mysql
1、mysql多表连接查询方式支支持nest loop,不支持hash join和sort merge join。pg支持多种连接查询方式。
2、mysql子查询性能比pg低。
3、mysql的复制是异步的,即无法通过主从架构做到数据零丢失。一些第三方公司也有改造mysql源代码实现同步复制,但是不是很稳定。mysql的同步复制让人很头痛。
注:mysql5.7后支持全同步复制,主节点执行完一个事务,所有的从节点执行了该事务才会返回客户端。因为需要等待所有的从库执行完该事务才能返回,所以全同步复制性能会收到很严重的影响。在主库上提交事务之后,所有的从库节点必须收到、apply并且提交这些事务,然后主库线程才能继续做后续操作,即缺点是主库完成一个事务的时间会被拉长,性能降低。
4、在线操作功能较弱:mysql创建索引会锁住整个表。即再建索引的过程中,表不能做任何操作。pg建索引不会锁住整个表。
解决方法1:
一些大的互联网公司修改mysql源码来实现在线DDL的功能。
解决方法2:
在主从架构中,创建索引一般在从(slave)中先创建索引,之后把从库切换为主库(主从切换),之后再原先的master现在的slave数据库上把DDL做完。
5、在线操作功能较弱:mysql表中加列,基本就是新建一个表。相当于物理上新建了个表,即物理操作。
6、mysql对sql语法支持的功能较弱,基本上不适合做数据仓库。虽然也有厂商开发了基于mysql的数据仓库存储引擎,但是这个方案知识解决了部分数据仓库的问题,sql功能弱的问题仍没有完全解决。该存储引擎的社区版还有很多限制,如:不支持数据更新,不支持太多的并发执行(最多支持十几个)等。而pg不仅支持复杂的sql还支持大量的分析函数,非常适合做数据仓库。clickhouse也适合做数据仓库。
pg
1、pg支持多种表连接方式。支持大多数的sql语法(如with子句,mysql也支持with)。
2、pg字段类型支持数据类型。
3、可以使用pl/PGSQL写存储过程(mysql也可以写存储过程),但是pg还可以使用各种主流开发语言的语法写存储过程。
4、上面的这些有点可以大大的节约开发资源。很多开发人员再pg上做开发时候,发现数据库已经帮自己实现了很多功能,甚至一些业务功能都可以直接使用数据库的功能解决,不再需要写代码来实现了。
5、性能优化工具丰富:pg中有大量的性能视图,可以方便的定位问题(如:可以看到正在执行的sql。可以通过锁示图看到谁在等待、那条记录被锁定等)
6、在线操作功能好:pg增加空值的列时本质上知识再系统表上把列定义上,无需对物理结构做更新,这就让pg在加列时可以做到瞬时完成。即物理操作(系统表)+逻辑操作
7、pg还支持在线建索引的功能,建索引的过程可以不锁更新操作。
8、pg支持同步复制功能,可以通过master和slave之间的复制实现零数据丢失的高可用方案。
总结
如果仅仅把数据库作为一个简单的存储功能使用(如一些大型互联网公司),一些复杂的功能都想放在应用中来实现,那么选择mysql很合适。如果应用的数据访问简单(如大多数的blog系统)那么后端使用mysql也很合适。
如果应用不简单,又不想消耗太多的开发资源,pg合适。使用python+postgresql架构,几十人就可以支持整个公司的业务。在数据库中使用pg,就像在开发语言中使用python,会让工作变得简洁高效。