一、事务隔离之间的比较
事务隔离级别 | postgresql | mysql |
---|---|---|
读未提交 | 无法读脏数据 | 有 |
读已提交 | 快照实现 | 快照实现 |
可重复读 | 有,无幻读,发生冲突时,牺牲其中一个事务 | 已实现,有幻读,悲观锁,因为Gap Lock问题,存在性能问题 |
可串行化 | 已实现,通过SSI实现,乐观锁,性能比较好 | 悲观锁,S2PL,性能不好,实用性比较差 |
二、持久化之间的比较
持久化技术 | postgresql | mysql |
---|---|---|
事务的持久化 | WAL日志 | binlog和innodb的redo log |
页断裂问题 | full_page_writes | double write |
检查块的一致性 | checksum | checksum,db_lock_checking |
事务同步提交 | 默认是同步synchronous_commit=on,session级别可以设置,更灵活 | sync_binlog=1,innodb_flush_log_at_trx_commit=1全局参数 |
三、复制之间的比较
postgresql | mysql |
---|---|
支持物理复制和逻辑复制 | 仅支持逻辑复制 |
物理复制延迟小 | 逻辑复制延时大 |
大更新对复制延迟影响小 | 大更新对复制延迟的影响很大,很容易导致复制延迟 |
物理复制主备之间数据绝对一致 | 逻辑复制可能出现准备数据不一致情况 |
支持一主多从,支持联级复制,不支持双主架构 | 支持一主多从,支持联级复制,支持双主架构 |
四、查询相关功能的比较
postgresql | mysql |
---|---|
成熟的基于代价的SQL优化器,复杂SQL性能很好 | 查询优化器不够成熟,非完全的基于代价的SQL优化器,对复杂查询的性能较低 |
多种表连接类型:nested-loop join,sort-merge join,hash join | 一种表连接类型:nested-loop |
非常智能,可以走多个索引 | 大部分查询只能使用表上得单一索引;在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还有慢 |
pg11版本之前表增加列基本上是重建表和索引,消耗时间比较长,pg11之后对非空列添加不需要重建 | 表增加列,只是在数据字典中增表定义,不会重建表 |
支持在线创建索引,pg10开始支持并行创建索引 | 支持在线创建索引,不支持并发索引 |
支持并行查询 | mysql8.0之前不支持并行查询 |
支持B-树,哈希,R-树和Gist索引 | B-树,哈希(不同存储引擎) |
五、表功能之间的比较
postgresql | mysql |
---|---|
除了支持pl/pgsql写存储过程,还支持pl/perl,pl/python,pl/tcl;也支持用C语言的写存储过程 | 存储过程与触发器功能有限 |
有单独的sequence | 没有单独的sequence,sequence在表主键上 |
PostGIS插件支持,PostGIS是目前使用最广泛地开源GIS系统 | GIS的支持有限 |
通过GIN索引提供了对JSON内部数据的索引,只要创建索引之后,不管存储json的数据格式如何变化,都能利用GIN索引加快查询 | json类型只支持虚拟列方式创建索引,不支持json内部数据的索引,当json内部的列结构不确定时,不能事先创建索引来提高查询性能 |
通过FDW框架完善支持外部表功能,可以方便连接其他异构数据源,如mysql,mongodb等 | 外部表功能有限,基本不具有太多实用价值 |
堆表,不支持索引组织表 | 索引组织表,不支持堆表 |
DDL不支持回滚,mysql8.0之前多个ddl不能原子执行 | ddl可以回滚,支持原子性DDL |
支持窗口函数 | mysql8.0之前不支持窗口函数 |
六、视图和安全之间的比较
postgresql | mysql |
---|---|
支持物化视图 | 不支持物化视图 |
支持临时表 | 支持临时表 |
支持主键,外键,唯一键,检查,非约束,还支持exclusion constraints | 支持主键,外键,唯一键,检查,非约束 |
支持两阶段提交 | 支持两阶段提交 |
认证方式丰富,信任/口令/PAM/LDAP/Kerberos/基于ident | 基本支持密码认证 |
可以使用pgcrypto库中的函数对列进行加密/解密;可以通过ssl连接实现网络加密 | 可以在表级制定密码来对数据进行加密;可以使用aes_encrypt和aes_decrypt函数对列数据进行加密和解密;可以通过ssl连接实现网络加密 |
使用explain命令查看查询的解释计划,结果很直观,也很详细 | 使用explan命令查看查询解释计划,但结果不直观,不详细 |
postgresql完成遵从ACID | mysql只有innodb等少量存储引擎遵从ACID |
参考文档:https://blog.csdn.net/qq_43303221/article/details/89338142