PostgreSQL
PostgreSQL简介
PostgreSQL 是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSQL可以运行在所有主流操作系统上,包括Linux、Unix和Windows。
PostgreSQL 是完全的事务安全性数据库,支持丰富的数据类型(如JSON和JSONB类型、数组类型)和自定义类型。PostgreSQL数据库提供了丰富的接口,可以很方便地扩展它的功能,如可以在GiST框架下实现自己的索引类型,支持使用C语言写自定义函数、触发器,也支持使用流行的编程语言写自定义函数。
PgSQL与MySQL的区别
- PostgreSQL (通常称为PG)和MySQL都是广泛使用的关系型数据库管理系统(RDBMS)。虽然它们都是用于存储和管理数据的关系数据库,但它们在一些方面有很大的区别,如下所述:
- 数据类型:PostgreSQL支持更多的数据类型,如范围类型、网络地址类型、JSON和XML数据类型等,而MySQL则不支持这些类型。
- 扩展性:PostgreSQL具有很高的扩展性,可以使用自定义数据类型、函数和操作符来扩展其功能。而MySQL的扩展性较差,需要使用插件或存储过程来实现类似的功能。
- ACID兼容性:PostgreSQL是完全ACID兼容的数据库,而MySQL只在特定的存储引擎(如InnoDB)中支持ACID。
- 多版本并发控制(MVCC):PostgreSQL使用MVCC来提供高级事务隔离级别,这意味着多个事务可以同时读取和写入数据库,而不会相互干扰。MySQL也支持MVCC,但其实现方式不同。
- 存储引擎:MySQL支持多个存储引擎,包括MyISAM和InnoDB等。每种存储引擎都有自己的特点和优缺点。PostgreSQL仅支持单个存储引擎。
- SQL标准兼容性:PostgreSQL更加符合SQL标准,而MySQL在某些方面采用了自己的实现方式。
- 性能:在一些特定的使用场景下,MySQL的性能可能更好。但在复杂的查询和高并发的情况下,PostgreSQL可能表现更好。
总之,PG 和 MySQL 都是出色的关系型数据库管理系统,具有不同的特点和优劣。选择哪个取决于具体的需求和使用场景。
从应用场景来说,PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM),而MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、facebook、alibaba)。
PgSQL相对于MySQL的优势
- 在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨,比较学院化;
- 存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力;
- 对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强;
- PG具有丰富的json能力,Json和jsonb数据类型,使得PG对json操作更快更有效。同样可以在json数据列上建立B-tree索引和GIN索引。XML和HSTORE数据类型可以处理XML格式以及其他复杂text格式的数据。对空间数据类型的支持,使得PG是一个完整的多模型数据库。
- PgSQL主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
- PgSQL的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。
- MySQL的存储引擎插件化机制,存在锁机制复杂影响并发的问题,而PgSQL不存在。
- Postgre SQL在性能上远远好于MYSQL, 通过上面的压测数据即可体现,无论是在耗时,还是在整体吞吐量上,有显著优势
- Postgre SQL在单行更新上有明显优势,尤其是启用了HOT UPDATE后, 性能比MYSQL高了一个数量级。
- MySQL 的事务隔离级别 repeatable read 并不能阻止常见的并发更新, 得加锁才可以, 但悲观锁会影响性能, 手动实现乐观锁又复杂。而 Postgre SQL 的列里有隐藏的乐观锁 version 字段, 默认的 repeatable read 级别就能保证并发更新的正确性, 并且又有乐观锁的性能。
MySQL相对于PgSQL的优势
1、innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。新老数据一起存放,需要定时触发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀;
2、MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束;
3、MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作;
4、MySQL分区表的实现要优于PG的基于继承表的分区实现,主要体现在分区个数达到上千上万后的处理性能差异较大。
5、MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。
事务和并发控制:
MySQL:MySQL支持基于行级别的并发控制,使用多版本并发控制(MVCC)机制来处理并发事务。它默认使用可重复读的隔离级别,但也支持其他隔离级别。MySQL的事务处理相对较简单。
PgSQL:PgSQL也支持多版本并发控制(MVCC),并提供更高级别的事务隔离级别。它支持序列化隔离级别,可以确保更高程度的数据一致性和完整性。
复制和高可用性:
MySQL:MySQL提供了主从复制的支持,可以实现数据的异步复制和读写分离。它还提供了一些高可用性解决方案,如MySQL Group Replication和MySQL InnoDB Cluster。
PgSQL:PgSQL也支持主从复制,可以实现数据的异步复制和读写分离。PgSQL还提供了一些高可用性解决方案,如PgPool-II和PostgreSQL自带的逻辑复制功能。
参考文章:
https://www.cnblogs.com/JackpotHan/p/16620758.html#pgsql%E7%9B%B8%E5%AF%B9%E4%BA%8Emysql%E7%9A%84%E4%BC%98%E5%8A%BF