PostgreSQL与MySQL相比优势何在

PostgreSQL类似于Oracle的多进程框架,可以支持高并发的应用场景。
如果把Oracle DBA转到PostgreSQL数据库上是比较容易的,毕竟PostgreSQL数据库与Oracle数据库很相似。
PostgreSQL几乎支持所有的SQL标准,支持类型相当丰富。
PostgreSQL数据库的源代码要比MySQL数据库的源代码更容易读懂,如果团队的C语言能力比较强的话,就可以在PostgreSQL数据库上做开发,比方说实现类似greenplum的系统,这样也能与现在的分布式趋势接轨。
为了说明PostgreSQL的功能,下面从“从Oracle迁移到Mysql之前必须知道的50件事”简要对比一下PostgreSQL数据库与MySQL数据库之间的差异。
从Oracle迁移到Mysql会面对的50件难事1、对子查询的优化表现不佳。
(PostgreSQL可解决)2、 对复杂查询的处理较弱。
(PostgreSQL可解决)3、 查询优化器不够成熟。
(PostgreSQL可解决)PostgreSQL完全支持SQL-92标准,对SQL的支持也很全面,可以支持复杂的SQL查询。
4、 性能优化工具与度量信息不足。
(PostgreSQL可解决)PostgreSQL提供了执行计划和详细的cost值,可以方便看到SQL的执行效率。
5、 审计功能相对较弱。
6、 安全功能不成熟,没有用户组与角色的概念,没有回收权限的功能(仅可以授予权限)。
当一个用户从不同的主机/网络以同样的用户名/密码登录之后,可能被当作完全不同的用户来处理,没有类似于Oracle的内置的加密功能。
7、 身份验证功能是完全内置的,不支持LDAP、Active Directory或其它类似的外部身份验证功能。
8、 Mysql Cluster可能与你想象的有较大差异。
9、 存储过程与触发器的功能有限。
(PostgreSQL可解决)PostgreSQL提供了完善的存储过程和触发器支持。
10、 垂直扩展性较弱。
11、 不支持MPP(大规模并行处理)。
(PostgreSQL可解决)PostgreSQL是类似Oracle数据库的多进程架构,而不像MySQL是多线程的架构,所以能支持MPP。
12、 支持SMP(对称多处理器),但是如果每个处理器超过4或8个核(core)时,Mysql的扩展性表现较差。
13、 对于时间、日期、间隔等时间类型没有秒
14、 可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱。
15、 没有基于回滚(roll-back)的恢复功能,只有前滚(roll-forward)的恢复功能。
16、 不支持快照功能。
17、 不支持数据库链(database link)。
有一种叫做Federated的存储引擎可以作为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙并且漏洞很多。
18、 数据完整性检查非常薄弱,即使是基本的完整性约束,也往往不能执行。
(PostgreSQL可解决)PostgreSQL提供完善的数据完整性检查机制,支持外键。
19、 优化查询语句执行计划的优化器提示非常少。
20、 只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。
(PostgreSQL可解决)PostgreSQL则支持这些表连接类型。
21、 大部分查询只能使用表上的单一索引;在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还要慢。
(PostgreSQL可解决)PostgreSQL数据不存在这个问题,假设表T的两个字段col1的col2上有两个索引,idx_1和idx_2,那么select * from t where col1=:a and col2=:b;查询时,PostgreSQL数据库有可能把这个查询转化为select * from t where col1=:a intersect select * from t where col2=:b,这样两个索引都可以使用上。
22、不支持位
每种存储引擎都支持不同类型的索引。
大部分存储引擎都支持B-Tree索引。
23、 管理工具较少,功能也不够成熟。
24、没有成熟能够令人满意的IDE工具与调试程序。
可能不得不在文本编辑器中编写存储过程,并且通过往表(调试日志表)中插入记录的方式来做调试。
25、 每个表都可以使用一种不同的存储引擎。
(PostgreSQL可解决)26、 每个存储引擎在行为表现、特性以及功能上都可能有很大差异。
(PostgreSQL可解决)27、大部分存储引擎都不支持外键。
(PostgreSQL可解决)28、默认的存储引擎(MyISAM)不支持事务,并且很容易损坏。
(PostgreSQL可解决)29、最先进最流行的存储引擎InnoDB由Oracle拥有。
(PostgreSQL可解决)30、有些执行计划只支持特定的存储引擎。
特定类型的Count查询,在这种存储引擎中执行很快,在另外一种存储引擎中可能会很慢。
(PostgreSQL可解决)PostgreSQL只有一种存储引擎,所以不存在上面的情况。
而PostgreSQL支持完善的事务。
31、执行计划并不是全局共享的,,仅仅在连接内部是共享的。
32、全文搜索功能有限, 只适用于非事务性存储引擎。
Ditto用于地理信息系统/空间类型和查询。
(PostgreSQL可解决)PostgreSQL数据库支持全文搜索,支持更多类型的索引,如B-tree,R-tree, Hash, GiST, GIN,R-tree,GIST,GIN索引可用于空间类型和查询。
33、没有资源控制。
一个完全未经授权的用户可以毫不费力地耗尽服务器的所有内存并使其崩溃,或者可以耗尽所有CPU资源。
34、没有集成商业智能(business intelligence), OLAP **数据集等软件包。
35、 没有与Grid Control类似的工具36、 没有类似于RAC的功能。
如果你问”如何使用Mysql来构造RAC”,只能说你问错了问题。
37、不支持用户自定义类型或域(domain)。
(PostgreSQL可解决)PostgreSQL支持丰富的类型,同时也支持自定义类型。
38、 每个查询支持的连接的数量最大为61。
39、MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。
不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。
支持部分类似于Merge或者类似特性的SQL语法扩展,不过相对于Oracle来讲功能非常简单。
(PostgreSQL可解决)这些PostgreSQL数据库都支持,如窗口函数。
40、不支持功能列(基于计算或者表达式的列,Oracle11g 开始支持计算列,以及早期版本就支持虚列(rownum,rowid))。
41、不支持函数索引,只能创建基于具体列的索引。
(PostgreSQL可解决)PostgreSQL支持函数索引。
42、不支持物化视
43、不同的存储引擎之间,统计信息差别很大,并且所有的存储引擎支持的统计信息都只支持简单的基数(cardinality)与一定范围内的记录数(rows-in-a-range)。
换句话说,数据分布统计信息是有限的。
更新统计信息的机制也不多。
44、没有内置的负载均衡与故障切换机制。
45、 复制(Replication)功能是异步的,并且有很大的局限性。
例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master。
46、 Cluster并不如想象的那么完美。
或许我已经提过这一点,但是这一点值得再说一遍。
47、数据字典(INFORMATION_SCHEMA)功能很有限,并且访问速度很慢(在繁忙的系统上还很容易发生崩溃)。
48、不支持在线的Alter Table操作。
49、 不支持Sequence。
(PostgreSQL可解决)PostgreSQL支持sequence。
50、 类似于ALTER TABLE或CREATE TABLE一类的操作都是非事务性的。
它们会提交未提交的事务,并且不能回滚也不能做灾难恢复。
Schame被保存在文件系统上,这一点与它使用的存储引擎无关。
(PostgreSQL可解决)PostgreSQL不存在这个问题。
每种数据库都有不同的应用场景PostgreSQL具备了更高的可靠性,对数据一致性、完整性的支持高于MySQL,因此PostgreSQL更加适合严格的企业应用场景,MySQL查询速度较快,更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。

MySQL和PostgreSQL是两个最流行的开源数据库,这往往是数据库管理员托管的最后两个数据库。
下面档将对两种开源数据库进行分析和比较,帮助您选择符合您操作需求的数据库。
PostgreSQL与MySQL相比,优势何在?
可靠性是PostgreSQL的主要目标之一。
我们都知道PostgreSQL的功能很强大,而且基础很好,能够支持任务和关键任务。
PostgreSQL提供高质量的文档服务,包括完整的免费在线手册和旧版手册的存档。
社区支持非常有效,独立公司也提供了商业支持。
Mysql和pgsql出现在一些高流量的网站上,可用于大型分布式系统,所有支持服务,支持有效性指数。
Mysql支持嵌入式应用,pgsql仍然支持传统的B/S架构。
MySQL可以产生快速的读取访问和各种查询,但具有复杂的属性和数据完整性检查,并不完全令人满意:pgsql是业务类的,针对MyISAM硬盘上的mysql开发的,因为很少进行数据完整性检查,所以对于敏感数据、快节奏、高读写要求的数据,ACID支持InnoDB功能是最好的选择,而且pgsql是一个完全集成的数据库,只有一个存储引擎。
确保数据的一致性和完整性也是PostgreSQL的重中之重,PostgreSQL数据库完全符合ACID原则(原子性、一致性、隔离性和耐久性)。
PostgreSQL对数据库的访问提供了强大的安全控制,不仅使用了Kerberos和OpenSSL等先进的企业安全工具,还根据业务需求定制了认证方法,以确保数据质量。
数据库管理员最钟爱的功能是时间恢(PITR),它提供了灵活性和高可用性,允许你快速创建故障转移服务器,在特定时间快速捕获和恢复。
但这还不是全部。
该项目提供了各种PostgreSQL管理技术,使PostgreSQL能够提供高可用性、负载均衡和同步,这样你就可以使用这些功能来满足你的特定需求。
Pgsql有非常强大的sql编程功能,有非常丰富的统计功能和统计语法,可以多语言编写过程,r的支持也非常好,这个mysql会从mysql的数据中心删除和处理,但是数据分析主要是Hadoop+PGSQL。
当我们使PostgreSQL对数据库时,看的见的文件仅仅是文件吗?非常稳定的系统PostgreSQL,如Innodb等引擎,在应对停电等极端冲击方面取得了显著的进步,但很多MySQL用户却面临着服务器上数据库不足的问题--MySQL库是MyISAM,它的性能稍微好一些 任何系统都有一个性能极限,在高读写速度下,当负载接近时,PG效率指数可以保持一个双曲线甚至对数曲线,峰值不会下降。
对于WEB应用来说,属性复制是非常重要的。
MySQL也是异步复制,pgsql可以同步、异步、半同步复制。
还有基于sync mysql复制binlog如oracle金门,基于jet复制,难以同步,所以比较适合复制,基于pgsql的wal复制,可以同步。
此外,pgsql还提供喷墨复制器。
Pgsql支持numa架构比mysql略好,不是读MYSQL的特点,pgsql可以完全异步,mysql的内存表不够实用!PostgresqI数据库安全测试与实践如下如所示:Pgsql有多种集群结构可以选择,plproxy可以保持镜像或背光操作者的级别,slony可以在字段级设置同步级别,standby可以创建WAL集群分区文件,同步频率和集群策略可以轻松改变,操作非常简单;
mysql发酵简单,系统表、操作者、可执行数据类型非常简单,非常容易简单查询。
Mysql分区表应该比Pgsql分区基于继承表更好。
它是R树中使用的索引,但空间功能在pgsql中并不丰富,而且空间访问速度比pgsql慢;
pgsql更适合比较严格的业务场景,如金融、电信、ERP、CRM等。
MySQL比较适合互联网场景,比如google、Facebook、淘宝等。
总结:答案写到这里,我想您应该明白了,PostgreSQL与MySQL相比各有千秋,两者都是世界上非常先进的数据库管理软件,通过使用PostgreSQL与MySQL,企业可以非常方便地管理内部数据。
Mysql分区表应该比Pgsql分区基于继承表更好。
而PostgreSQL数据库完全符合ACID原则(原子性、一致性、隔离性和耐久性) 并且PostgreSQL提供高质量的文档服务,包括完整的免费在线手册和旧版手册的存档。
可以看出,未来必将会有更多的厂商或者企业选择PostgreSQL。

MySQL是单存储引擎,PostgreSQL是多存储引擎,包括InnoDB、MyISAM等。
删除临时表的时候,PostgreSQL语句没有TEMP、TEMPORARY关键字,DROP TABLE通过数据库连接的排列被删除。
MySQL支持TEMP、TEMPORARY关键字,DROP TABLE语句只允许删除临时表,要手动删除。
PostgreSQL支持CASCADE选择删除表的依赖对象,PostgreSQL的TRUNCATE TABLE支持功能更多。
MySQL TRUNCATE TABLE不支持CASCADE食物安全,数据删除之后就没办法回滚了。
PostgreSQL支持多种高级数据类型,比如array,用户也可以定义类型,MySQL只支持标准类型。
PostgreSQL支持布尔型,支持IP地址数据类型,支持常量和函数调用。
PostgreSQL支持JSON和其他NoSQL功能,本机支持XML,允许索引JSON数据,MySQL支持JSON,不过不支持其他的NoSQL功能。
PostgreSQL的对象统计功能也很强,这一点MySQL也有差距。
PostgreSQL是多进程、MySQL是多线程。
PostgreSQL支持大多数命令类型上触发的触发器。
MySQL是异步复制,PostgreSQL支持同步、异步、半同步复制。
PostgreSQL要求所有数据必须完全满足需求,只要出一个错误整个数据入库过程都要失败,不过MySQL没这样的问题。
最后一个优势,也是我在文章开头说到的,也是我认为最大的优势,MySQL诞生于商业公司,现在是让人生厌的Oracle控制,尽管MySQL现在依然是开源免费的,可是在Oracle手里总是会让人担心。
Java在oracle手机搞了些啥大家应该都知道吧,现在Oracle动不动出来恶心恶心大家,反正甲骨文是个不靠谱的公司,随时想要搞点事情。
PostgreSQL则是诞生于加州伯克利,伯克利还是对计算机技术有过突出贡献的高校的,PostgreSQL、FreeBSD都是非常有代表性的,这个不会存在像Oracle那么恶心,所以这个也是一个极大的优势。

参考:
一、 PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃、断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统库是MyISAM的,相比之下,PG数据库这方面要好一些。
二、任何系统都有它的性能极限,在高并发读写,负载逼近极限下,PG的性能指标仍可以维持双曲线甚至对数曲线,到顶峰之后不再下降,而 MySQL 明显出现一个波峰后下滑(5.5版本之后,在企业级版本中有个插件可以改善很多,不过需要付费)。
三、PG 多年来在 GIS 领域处于优势地位,因为它有丰富的几何类型,实际上不止几何类型,PG有大量字典、数组、bitmap 等数据类型,相比之下mysql就差很多,instagram就是因为PG的空间数据库扩展POSTGIS远远强于MYSQL的my spatial而采用PGSQL的。
四、PG 的“无锁定”特性非常突出,甚至包括 vacuum 这样的整理数据空间的操作,这个和PGSQL的MVCC实现有关系。
五、PG 的可以使用函数和条件索引,这使得PG数据库的调优非常灵活,mysql就没有这个功能,条件索引在web应用中很重要。
六、PG有极其强悍的 SQL 编程能力(9.x
这一点上MYSQL就差的很远,很多分析功能都不支持,腾讯内部数据存储主要是MYSQL,但是数据分析主要是HADOOP+PGSQL。
七、PG 的有多种集群架构可以选择,plproxy 可以支持语句级的镜像或分片,slony 可以进行字段级的同步设置,standby 可以构建WAL文件级或流式的读写分离集群,同步频率和集群策略调整方便,操作非常简单。
八、一般关系型数据库的字符串有限定长度8k左右,无限长 TEXT 类型的功能受限,只能作为外部大数据访问。
而 PG 的 TEXT 类型可以直接访问,SQL语法内置正则表达式,可以索引,还可以全文检索,或使用xml xpath。
用PG的话,文档数据库都可以省了。
九,对于WEB应用来说,复制的特性很重要,mysql到现在也是异步复制,pgsql可以做到同步,异步,半同步复制。
还有mysql的同步是基于binlog复制,类似oracle golden gate,是基于stream的复制,做到同步很困难,这种方式更加适合异地复制,pgsql的复制基于wal,可以做到同步复制。
同时,pgsql还提供stream复制。
十,pgsql对于numa架构的支持比mysql强一些,比MYSQL对于读的性能更好一些,pgsql提交可以完全异步,而mysql的内存表不够实用(因为表锁的原因)最后说一下我感觉 PG 不如 MySQL 的地方。
第一,MySQL有一些实用的运维支持,如 slow-query.log ,这个pg肯定可以定制出来,但是如果可以配置使用就更好了。
第二是mysql的innodb引擎,可以充分优化利用系统所有内存,超大内存下PG对内存使用的不那么充分,第三点,MySQL的复制可以用多级从库,但是在9.2之前,PGSQL不能用从库带从库。
第四点,从测试结果上看,mysql 5.5的性能提升很大,单机性能强于pgsql,5.6应该会强更多.第五点,对于web应用来说,mysql 5.6 的内置MC API功能很好用,PGSQL差一些。
另外一些:pgsql和mysql都是背后有商业公司,而且都不是一个公司。
大部分开发者,都是拿工资的。
说mysql的执行速度比pgsql快很多是不对的,速度接近,而且很多时候取决于你的配置。
对于存储过程,函数,视
另外多线程架构和多进程架构之间没有绝对的好坏,oracle在unix上是多进程架构,在windows上是多线程架构。
很多pg应用也是24/7的应用,比如skype. 最近几个版本VACUUM基本不影响PGSQL 运行,8.0之后的PGSQL不需要cygwin就可以在windows上运行。
至于说对于事务的支持,mysql和pgsql都没有问题。

参考:
PostgreSQLPostgreSQL标榜自己是世界上最先进的开源数据库。
PostgreSQL的一些粉丝说它能与Oracle相媲美,而且没有那么昂贵的价格和傲慢的客服。
最初是1985年在加利福尼亚大学伯克利分校开发的,作为Ingres数据库的后继。
PostgreSQL是完全由社区驱动的开源项目。
它提供了单个完整功能的版本,而不像MySQL那样提供了多个不同的社区版、商业版与企业版。
PostgreSQL基于自由的BSD/MIT许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声明即可。
MySQLMySQL声称自己是最流行的开源数据库。
LAMP中的M指的就是MySQL。
构建在LAMP上的应用都会使用MySQL,如WordPress、Drupal等大多数php开源程序。
MySQL最初是由MySQL AB开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被Oracle收购。
Oracle支持MySQL的多个版本:Standard、Enterprise、Classic、Cluster、Embedded与Community。
其中有一些是免费下载的,另外一些则是收费的。
其核心代码基于GPL许可,由于MySQL被控制在Oracle,社区担心会对MySQL的开源会有影响,所以开发了一些分支,比如: MariaDB和Percona。
MySQL与PostgreSQL的对比MySQL的背后是一个成熟的商业公司,而PostgreSQL的背后是一个庞大的志愿开发组。
这使得MySQL的开发过程更为慎重,而PostgreSQL的反应更为迅速。
这样的两种背景直接导致了各自固有的优点和缺点。
PostgreSQL相对于MySQL的优势1)不仅仅是关系型数据库除了存储正常的数据类型外,还支持存储:array,不管是一位数组还是多为数组均支持json(hStore)和jsonb,相比使用text存储接送要高效很多json和jsonb之间的区别jsonb和json在更高的层面上看起来几乎是一样的,但在存储实现上是不同的。
json存储完的文本,json列会每次都解析存储的值,它不支持索引,但你可以为查询创建表达式索引。
jsonb存储的二进制格式,避免了重新解析数据结构。
它支持索引,这意味着你可以不使用指定的索引就能查询任何路径。
当我们比较写入数据速度时,由于数据存储的方式的原因,jsonb会比json稍微的慢一点。
json列会每次都解析存储的值,这意味着键的顺序要和输入的时候一样。
但jsonb不同,以二进制格式存储且不保证键的顺序。
因此,如果你有软件需要依赖键的顺序,jsonb可能不是你的应用的最佳选择。
使用jsonb的优势还在于你可以轻易的整合关系型数据和非关系型数据, PostgreSQL对于mongodb这类的基于文档的数据库是个不小的威胁,毕竟如果一个表中只有一列数据的类型是半结构化的,没有必要为了迁就它而整个表的设计采用schemaless的结构。
2)支持地理信息处理扩展PostGIS 为PostgreSQL提供了存储空间地理数据的支持,使PostgreSQL成为了一个空间数据库,能够进行空间数据管理、数量测量与几何拓扑分析。
在功能上,和MYSQL对比,PostGIS具有下列优势:O2O业务场景中的LBS业务使用PostgreSQL + PostGIS有无法比拟的优势。
3)可以快速构建REST APIPostgREST 可以方便的为任何 PostgreSQL 数据库提供完全的 RESTful API 服务。
4)支持树状结构支持R-trees这样可扩展的索引类型,可以更方便地处理一些特殊数据。
MySQL 处理树状的设计会很复杂, 而且需要写很多代码, 而 PostgreSQL 可以高效处理树结构。
5)有极其强悍的 SQL 编程能力支持递归,有非常丰富的统计函数和统计语法支持。
MySQL:支持 CREATE PROCEDURE 和 CREATE FUNCTION 语句。
存储过程可以用 SQL 和 C++ 编写。
用户定义函数可以用 SQL、C 和 C++ 编写。
PostgreSQL:没有单独的存储过程,都是通过函数实现的。
用户定义函数可以用 PL/pgSQL(专用的过程语言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 编写。
6)外部数据源支持可以把 70 种外部数据源 (包括 Mysql, Oracle, CSV, hadoop …) 当成自己数据库中的表来查询。
Postgres有一个针对这一难题的解决方案:一个名为“外部数据封装器(Foreign Data Wrapper,FDW)”的特性。
该特性最初由PostgreSQL社区领袖Dave Page四年前根据SQL标准SQL/MED(SQL Management of External Data)开发。
FDW提供了一个SQL接口,用于访问远程数据存储中的远程大数据对象,使DBA可以整合来自不相关数据源的数据,将它们存入Postgres数据库中的一个公共模型。
这样,DBA就可以访问和操作其它系统管理的数据,就像在本地Postgres表中一样。
例如,使用FDW for MongoDB,数据库管理员可以查询来自文档数据库的数据,并使用SQL将它与来自本地Postgres表的数据相关联。
借助这种方法,用户可以将数据作为行、列或JSON文档进行查看、排序和分组。
他们甚至可以直接从Postgres向源文档数据库写入(插入、更细或删除)数据,就像一个一体的无缝部署。
也可以对Hadoop集群或MySQL部署做同样的事。
FDW使Postgres可以充当企业的中央联合数据库或“Hub”。
7)没有字符串长度限制一般关系型数据库的字符串有限定长度8k左右,无限长 TEXT 类型的功能受限,只能作为外部大数据访问。
而PostgreSQL的 TEXT 类型可以直接访问,SQL语法内置正则表达式,可以索引,还可以全文检索,或使用xml xpath。
MySQL 的各种text字段有不同的限制,要手动区分 small text, middle text, large text… PostgreSQL 没有这个限制,text 能支持各种大小。
8)支持
参考链接:https://mp.weixin.qq.com/s/cjor82wgDu5gzDvTYpLDWw9)支持窗口函数窗口函数提供跨行相关的当前查询行集执行计算的能力。
仅当调用跟着OVER子句的聚集函数,作为窗口函数;否则它们作为常规的聚合函数。
窗口也是一种分组,但和 group by 的分组不同。
窗口,可以提供分组之外,还可以执行对每个窗口进行计算。
可以想象成是group by 后,然后对每个分组进行计算,而不像Group by ,只是单纯地分组。
MySQL 不支持 OVER 子句, 而PostgreSQL支持。
OVER 子句能简单的解决 “每组取 top 5” 的这类问题。
MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。
不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。
10)对索引的支持更强PostgreSQL 的可以使用函数和条件索引,这使得PostgreSQL数据库的调优非常灵活,mysql就没有这个功能,条件索引在web应用中很重要。
对于索引类型:MySQL:取决于存储引擎。
MyISAM:BTREE,InnoDB:BTREE。
PostgreSQL:支持 B-树、哈希、R-树和 Gist 索引。
InnoDB的表和索引都是按相同的方式存储。
也就是说表都是索引组织表。
这一般要求主键不能太长而且插入时的主键最好是按顺序递增,否则对性能有很大影响。
PostgreSQL不存在这个问题。
索引类型方面,MySQL取决于存储引擎。
MyISAM:BTREE,InnoDB:B+TREE。
PostgreSQL支持 B-树、哈希、R-树和 Gist 索引。
11)集群支持更好Mysql Cluster可能与你的想象有较大差异。
开源的cluster软件较少。
复制(Replication)功能是异步的并且有很大的局限性。
例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master。
PostgreSQL有丰富的开源cluster软件支持。
plproxy 可以支持语句级的镜像或分片,slony 可以进行字段级的同步设置,standby 可以构建WAL文件级或流式的读写分离集群,同步频率和集群策略调整方便,操作非常简单。
另外,PostgreSQL的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。
对于WEB应用来说,复制的特性很重要,mysql到现在也是异步复制,pgsql可以做到同步,异步,半同步复制。
还有mysql的同步是基于binlog复制,类似oracle golden gate,是基于stream的复制,做到同步很困难,这种方式更加适合异地复制,pgsql的复制基于wal,可以做到同步复制。
同时,pgsql还提供stream复制。
12)事务隔离做的更好MySQL 的事务隔离级别 repeatable read 并不能阻止常见的并发更新, 得加锁才可以, 但悲观锁会影响性能, 手动实现乐观锁又复杂. 而 PostgreSQL 的列里有隐藏的乐观锁 version 字段, 默认的 repeatable read 级别就能保证并发更新的正确性, 并且又有乐观锁的性能。
13)对于字符支持更好一些MySQL 里需要 utf8mb4 才能显示 emoji 的坑, PostgreSQL 没这个坑。
14)对表连接支持较完整对表连接支持较完整,MySQL只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。
PostgreSQL都支持。
15)存储方式支持更大的数据量PostgreSQL主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
16)时间精度更高MySQL对于时间、日期、间隔等时间类型没有秒
17)优化器的功能较完整MySQL对复杂查询的处理较弱,查询优化器不够成熟,explain看执行计划的结果简单。
性能优化工具与度量信息不足。
PostgreSQL很强大的查询优化器,支持很复杂的查询处理。
explain返回丰富的信息。
提供了一些性能视
网上有一个开源的pgstatspack工具。
18)序列支持更好MySQL 不支持多个表从同一个序列中取 id, 而 PostgreSQL 可以。
19)对子查询支持更好对子查询的支持。
虽然在很多情况下在SQL语句中使用子查询效率低下,而且绝大多数情况下可以使用带条件的多表连接来替代子查询,但是子查询的存在在很多时候仍然不可避免。
而且使用子查询的SQL语句与使用带条件的多表连接相比具有更高的程序可读性。
几乎任何数据库的子查询 (subquery) 性能都比 MySQL 好。
20)增加列更加简单MySQL表增加列,基本上是重建表和索引,会花很长时间。
PostgreSQL表增加列,只是在数据字典中增加表定义,不会重建表.MySQL相对于PostgreSQL的优势1)MySQL比PostgreSQL更流行流行对于一个商业软件来说,也是一个很重要的指标,流行意味着更多的用户,意味着经受了更多的考验,意味着更好的商业支持、意味着更多、更完善的文档资料。
易用,很容易安装。
第三方工具,包括可视化工具,让用户能够很容易入门。
2)回滚实现更优innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。
新老数据一起存放,需要定时触发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。
而且VACUUM清理不及时,还可能会引发数据膨胀。
3)在Windows上运行更可靠与PostgreSQL相比,MySQL更适宜在Windows环境下运行。
MySQL作为一个本地的Windows应用程序运行(在 NT/Win2000/WinXP下,是一个服务),而PostgreSQL是运行在Cygwin模拟环境下。
PostgreSQL在Windows下运行没有MySQL稳定,应该是可以想象的。
4)线程模式相比进程模式的优势MySQL使用了线程,而PostgreSQL使用的是进程。
在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。
进程模式对多CPU利用率比较高。
进程模式共享数据需要用到共享内存,而线程模式数据本身就是在进程空间内都是共享的,不同线程访问只需要控制好线程之间的同步。
线程模式对资源消耗比较少。
所以MySQL能支持远比PostgreSQL多的更多的连接。
但PostgreSQL中有优秀的连接池软件软件,如pgbouncer和pgpool,所以通过连接池也可以支持很多的连接。
5)权限设置上更加完善MySQL在权限系统上比PostgreSQL某些方面更为完善。
PostgreSQL只支持对于每一个用户在一个数据库上或一个数据表上的 INSERT、SELECT和UPDATE/DELETE的授权,而MySQL允许你定义一整套的不同的数据级、表级和列级的权限。
对于列级的权限, PostgreSQL可以通过建立视
MySQL还允许你指定基于主机的权限,这对于目前的PostgreSQL是无法实现的,但是在很多时候,这是有用的。
6)存储引擎插件化机制MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。
7)适应24/7运行MySQL可以适应24/7运行。
在绝大多数情况下,你不需要为MySQL运行任何清除程序。
PostgreSQL目前仍不完全适应24/7运行,这是因为你必须每隔一段时间运行一次VACUUM。
8)更加试用于简单的场景PostgreSQL只支持堆表,不支持索引组织表,Innodb只支持索引组织表。
索引组织表的优势:表内的数据就是按索引的方式组织,数据是有序的,如果数据都是按主键来访问,那么访问数据比较快。
而堆表,按主键访问数据时,是需要先按主键索引找到数据的物理位置。
索引组织表的劣势:索引组织表中上再加其它的索引时,其它的索引记录的数据位置不再是物理位置,而是主键值,所以对于索引组织表来说,主键的值不能太大,否则占用的空间比较大。
对于索引组织表来说,如果每次在中间插入数据,可能会导致索引分裂,索引分裂会大大降低插入的性能。
所以对于使用innodb来说,我们一般最好让主键是一个无意义的序列,这样插入每次都发生在最后,以避免这个问题。
由于索引组织表是按一个索引树,一般它访问数据块必须按数据块之间的关系进行访问,而不是按物理块的访问数据的,所以当做全表扫描时要比堆表慢很多,这可能在OLTP中不明显,但在数据仓库的应用中可能是一个问题。

参考:
当我们选择哪种数据库对我们的项目最合适时,必须在数据库之间进行比较。
PostgreSQL和MySQL都是开源社区提供的两种最广泛的数据库。
这两个数据库都有其优点和缺点,因此更好的选择取决于特定的要求和目标。
MySQLMySQL是一种开放源代码且流行的数据库管理系统,用于管理 关系数据库 。
Oracle提供了访问和管理该数据库的支持。
与其他数据库相比,它是快速,可伸缩且易于使用的数据库管理系统。
它通常与PHP脚本一起使用,以创建功能强大且动态的服务器端或基于Web的企业应用程序。
PostgreSQLPostgreSQL 是一个先进的,开放源代码的[对象]-关系型数据库管理系统,它的主要目标是实现标准和可扩展性. PostgreSQL, 或者说是 Postgres, 试
对比其他的RDBMS, PostgreSQL以它对于对象-关系和或关系型数据库功能,比如对于可靠事务,例如原子性,一致性,隔离性和持久性(ACID)的完全支持,这些东西的高度需求和集合的支持,以示其独特性。
PostgreSQL是高度可编程的, 因而可以使用被称作“存储过程”的自定义程序进行扩展. 这些功能可以被创建用来简化一个重复、复杂并且常常需要数据库操作的任务的执行。
PostgreSQL比MySQL的优势1、PostgreSQL是一个非常安全,独立且功能丰富的开源数据库。
2、PostgreSQL支持许多高级数据类型,例如多维数组,用户定义的类型等。
3、PostgreSQL很好地遵循了SQL标准,并支持“高级” SQL内容,例如窗口函数或公共表表达式。
4、它提供了Oracle和SQL Server支持的所有性能优化。
MySQL比PostgreSQL的优势1、就数据库排名而言,MySQL比PostgreSQL更受
2、在MySQL中,获得社区支持和搜索答案比PostgreSQL更容易。
3、复制是在MySQL而非PostgreSQL中很好地实现的。
如有不同观点,
如果喜欢我的回答,

参考:
postgreSQL 和 MySql 都是支持 SQL标准(比如sql92, sql99),最主要的一点是: mysql 自从被oracle收购之后,社区担心它的命运像java一样,于是大量开源项目纷纷转向 postgresql。
postgresql 的管理工具:pgadmin 非常便捷,可以细粒度的操作数据库。

参考:
PostgreSQL类似于Oracle的多进程框架,可以支持高并发的应用场景。
如果把OracleDBA转到PostgreSQL数据库上是比较容易的,毕竟PostgreSQL数据库与Oracle数据库很相似。
PostgreSQL几乎支持所有的SQL标准,支持类型相当丰富。
PostgreSQL数据库的源代码要比MySQL数据库的源代码更容易读懂,如果团队的C语言能力比较强的话,就可以在PostgreSQL数据库上做开发,比方说实现类似greenplum的系统,这样也能与现在的分布式趋势接轨。
从Oracle迁移到Mysql会面对的50件难事:1、对子查询的优化表现不佳。
(PostgreSQL可解决)2、对复杂查询的处理较弱。
(PostgreSQL可解决)3、查询优化器不够成熟。
(PostgreSQL可解决)PostgreSQL完全支持SQL-92标准,对SQL的支持也很全面,可以支持复杂的SQL查询。
4、性能优化工具与度量信息不足。
(PostgreSQL可解决)PostgreSQL提供了执行计划和详细的cost值,可以方便看到SQL的执行效率。
5、审计功能相对较弱。
6、安全功能不成熟,没有用户组与角色的概念,没有回收权限的功能(仅可以授予权限)。
当一个用户从不同的主机/网络以同样的用户名/密码登录之后,可能被当做完全不同的用户来处理,没有类似于Oracle的内置的加密功能。
7、身份验证功能是完全内置的,不支持LDAP、ActiveDirectory或其它类似的外部身份验证功能。
8、MysqlCluster可能与你想象的有较大差异。
9、存储过程与触发器的功能有限。
(PostgreSQL可解决)PostgreSQL提供了完善的存储过程和触发器支持。
10、垂直扩展性较弱。
11、不支持MPP(大规模并行处理)。
(PostgreSQL可解决)PostgreSQL是类似Oracle数据库的多进程架构,而不像MySQL是多线程的架构,所以能支持MPP。
12、支持SMP(对称多处理器),但是如果每个处理器超过4或8个核(core)时,Mysql的扩展性表现较差。
13、对于时间、日期、间隔等时间类型没有秒
14、可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱。
15、没有基于回滚(roll-back)的恢复功能,只有前滚(roll-forward)的恢复功能。
16、不支持快照功能。
17、不支持数据库链(databaselink)。
有一种叫做Federated的存储引擎可以作为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙并且漏洞很多。
18、数据完整性检查非常薄弱,即使是基本的完整性约束,也往往不能执行。
(PostgreSQL可解决)PostgreSQL提供完善的数据完整性检查机制,支持外键。
19、优化查询语句执行计划的优化器提示非常少。
20、只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-mergejoin)与散列连接(hashjoin)。
(PostgreSQL可解决)PostgreSQL则支持这些表连接类型。
21、大部分查询只能使用表上的单一索引;
在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还要慢。
(PostgreSQL可解决)PostgreSQL数据不存在这个问题,假设表T的两个字段col1的col2上有两个索引,idx_1和idx_2,那么select*fromtwherecol1=:aandcol2=:b;查询时,PostgreSQL数据库有可能把这个查询转化为select*fromtwherecol1=:aintersectselect*fromtwherecol2=:b,这样两个索引都可以使用上。
22、不支持位
每种存储引擎都支持不同类型的索引。
大部分存储引擎都支持B-Tree索引。
23、管理工具较少,功能也不够成熟。
24、没有成熟能够令人满意的IDE工具与调试程序。
可能不得不在文本编辑器中编写存储过程,并且通过往表(调试日志表)中插入记录的方式来做调试。
25、每个表都可以使用一种不同的存储引擎。
(PostgreSQL可解决)26、每个存储引擎在行为表现、特性以及功能上都可能有很大差异。
(PostgreSQL可解决)27、大部分存储引擎都不支持外键。
(PostgreSQL可解决)28、默认的存储引擎(MyISAM)不支持事务,并且很容易损坏。
(PostgreSQL可解决)29、最先进最流行的存储引擎InnoDB由Oracle拥有。
(PostgreSQL可解决)30、有些执行计划只支持特定的存储引擎。
特定类型的Count查询,在这种存储引擎中执行很快,在另外一种存储引擎中可能会很慢。
(PostgreSQL可解决)PostgreSQL只有一种存储引擎,所以不存在上面的情况。
而PostgreSQL支持完善的事务。
31、执行计划并不是全局共享的,仅仅在连接内部是共享的。
32、全文搜索功能有限,只适用于非事务性存储引擎。
Ditto用于地理信息系统/空间类型和查询。
(PostgreSQL可解决)PostgreSQL数据库支持全文搜索,支持更多类型的索引,如B-tree,R-tree,Hash,GiST,GIN,R-tree,GIST,GIN索引可用于空间类型和查询。
33、没有资源控制。
一个完全未经授权的用户可以毫不费力地耗尽服务器的所有内存并使其崩溃,或者可以耗尽所有CPU资源。
34、没有集成商业智能(businessintelligence),OLAP数据集等软件包。
35、没有与GridControl类似的工具36、没有类似于RAC的功能。
如果你问”如何使用Mysql来构造RAC”,只能说你问错了问题。
37、不支持用户自定义类型或域(domain)。
(PostgreSQL可解决)PostgreSQL支持丰富的类型,同时也支持自定义类型。
38、每个查询支持的连接的数量最大为61。
39、MySQL支持的SQL语法(ANSISQL标准)的很小一部分。
不支持递归查询、通用表表达式(Oracle的with语句)或者窗口函数(分析函数)。
支持部分类似于Merge或者类似特性的SQL语法扩展,不过相对于Oracle来讲功能非常简单。
(PostgreSQL可解决)这些PostgreSQL数据库都支持,如窗口函数。
40、不支持功能列(基于计算或者表达式的列,Oracle11g开始支持计算列,以及早期版本就支持虚列(rownum,rowid))。
41、不支持函数索引,只能创建基于具体列的索引。
(PostgreSQL可解决)PostgreSQL支持函数索引。
42、不支持物化视
43、不同的存储引擎之间,统计信息差别很大,并且所有的存储引擎支持的统计信息都只支持简单的基数(cardinality)与一定范围内的记录数(rows-in-a-range)。
换句话说,数据分布统计信息是有限的。
更新统计信息的机制也不多。
44、没有内置的负载均衡与故障切换机制。
45、复制(Replication)功能是异步的,并且有很大的局限性。
例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master。
46、Cluster并不如想象的那么完美。
或许我已经提过这一点,但是这一点值得再说一遍。
47、数据字典(INFORMATION_SCHEMA)功能很有限,并且访问速度很慢(在繁忙的系统上还很容易发生崩溃)。
48、不支持在线的AlterTable操作。
49、不支持Sequence。
(PostgreSQL可解决)PostgreSQL支持sequence。
50、类似于ALTERTABLE或CREATETABLE一类的操作都是非事务性的。
它们会提交未提交的事务,并且不能回滚也不能做灾难恢复。
Schame被保存在文件系统上,这一点与它使用的存储引擎无关。
(PostgreSQL可解决)PostgreSQL不存在这个问题。
每种数据库都有不同的应用场景PostgreSQL具备了更高的可靠性,对数据一致性、完整性的支持高于MySQL,因此PostgreSQL更加适合严格的企业应用场景,MySQL查询速度较快,更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。

参考:
优势在于三天两头出问题,还没有人熟悉[泪奔]
参考:
PostGis,MySQL虽然5.7支持geo(抄),但相比PostGis完善的地理坐标系,MySQL的geo更像是残次品

标签