[DB]PostgreSQL 与 MySQL 相比,优势何在?

待兔 等级 638 0 0

PostgreSQL 与 MySQL 相比,优势何在? - 数据库 - 知乎
Pg 没有 MySQL 的各种坑

MySQL 的各种 text 字段有不同的限制, 要手动区分 small text, middle text, large text... Pg 没有这个限制, text 能支持各种大小.

按照 SQL 标准, 做 null 判断不能用 = null, 只能用 is null
the result of any arithmetic comparison with NULL is also NULL
但 pg 可以设置 transform_null_equals 把 = null 翻译成 is null 避免踩坑

不少人应该遇到过 MySQL 里需要 utf8mb4 才能显示 emoji 的坑, Pg 就没这个坑.

MySQL 的事务隔离级别 repeatable read 并不能阻止常见的并发更新, 得加锁才可以, 但悲观锁会影响性能, 手动实现乐观锁又复杂. 而 Pg 的列里有隐藏的乐观锁 version 字段, 默认的 repeatable read 级别就能保证并发更新的正确性, 并且又有乐观锁的性能. 附带一个各数据库对隔离级别的行为差异比较调查: http://www.cs.umb.edu/~poneil/iso.pdf

MySQL 不支持多个表从同一个序列中取 id, 而 Pg 可以.

MySQL 不支持 OVER 子句, 而 Pg 支持. OVER 子句能简单的解决 "每组取 top 5" 的这类问题.

几乎任何数据库的子查询 (subquery) 性能都比 MySQL 好.

更多的坑:
http://blog.ionelmc.ro/2014/12/28/terrible-choices-mysql/

不少人踩完坑了, 以为换个数据库还得踩一次, 所以很抗拒, 事实上不是!!!

Pg 不仅仅是 SQL 数据库

它可以存储 array 和 json, 可以在 array 和 json 上建索引, 甚至还能用表达式索引. 为了实现文档数据库的功能, 设计了 jsonb 的存储结构. 有人会说为什么不用 Mongodb 的 BSON 呢? Pg 的开发团队曾经考虑过, 但是他们看到 BSON 把 ["a", "b", "c"] 存成 {0: "a", 1: "b", 2: "c"} 的时候就决定要重新做一个 jsonb 了... 现在 jsonb 的性能已经优于 BSON.

现在往前端偏移的开发环境里, 用 Pg + PostgREST 直接生成后端 API 是非常快速高效的办法:
begriffs/postgrest · GitHub
postgREST 的性能非常强悍, 一个原因就是 Pg 可以直接组织返回 json 的结果.

它支持服务器端脚本: TCL, Python, R, Perl, Ruby, MRuby ... 自带 map-reduce 了.

它有地理信息处理扩展 (GIS 扩展不仅限于真实世界, 游戏里的地形什么的也可以), 可以用 Pg 搭寻路服务器和地图服务器:
PostGIS — Spatial and Geographic Objects for PostgreSQL

它自带全文搜索功能 (不用费劲再装一个 elasticsearch 咯):
Full text search in milliseconds with PostgreSQL 不过一些语言相关的支持还不太完善, 有个 bamboo 插件用调教过的 mecab 做中文分词, 如果要求比较高, 还是自己分了词再存到 tsvector 比较好.

它支持 trigram 索引.
trigram 索引可以帮助改进全文搜索的结果: PostgreSQL: Documentation: 9.3: pg_trgm
trigram 还可以实现高效的正则搜索 (原理参考 https://swtch.com/~rsc/regexp/regexp4.html )

MySQL 处理树状回复的设计会很复杂, 而且需要写很多代码, 而 Pg 可以高效处理树结构:
Scaling Threaded Comments on Django at Disqus
http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures

它可以高效处理图结构, 轻松实现 "朋友的朋友的朋友" 这种功能:
http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age

它可以把 70 种外部数据源 (包括 Mysql, Oracle, CSV, hadoop ...) 当成自己数据库中的表来查询:
Foreign data wrappers

心动不如行动

Converting MySQL to PostgreSQL

收藏
评论区

相关推荐

postgresql和mysql哪个好
postgresql和mysql都是免费且功能强大的开源数据库,很多用户面对这两个库都会有一个问题,那就是哪一个才是最好的开源数据库,MySQL还是PostgreSQL呢?该选择哪一个开源数据库呢? postgresql和mysql哪个好 一.PostgreSQL相对于MySQL的优势 1、在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨;
[DB]PostgreSQL 与 MySQL 相比,优势何在?
PostgreSQL 与 MySQL 相比,优势何在? 数据库 知乎 Pg 没有 MySQL 的各种坑 MySQL 的各种 text 字段有不同的限制, 要手动区分 small text, middle text, large text... Pg 没有这个限制, text 能支持各种大小. 按照 SQL 标准, 做 null 判断不能用
MySQL8与PG10:新版本下的较量谁更胜一筹?
既然MySQL 8和PostgreSQL 10已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的。在这些版本之前,人们普遍认为,PostgreSQL在功能集表现更出色,也因其“学院派”风格而备受称赞,MySQL则更善长大规模并发读/写。但是随着它们最新版本的发布,两者之间的差距明显变小了。特性比较首先来看看我们都喜欢谈论的“时髦”功能。过去
MySQL与PostgreSQL相比哪个更好?
网上已经有很多拿PostgreSQL与MySQL比较的文章了,这篇文章只是对一些重要的信息进行下梳理。在开始分析前,先来看下这两张图: ![](https://oscimg.oschina.net/oscnet/3de5a066c29e80cc3d9a783fc2932b7a66d.png) MySQL MySQL声称自己是最流行的开源数据库。LAMP
Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解
### Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解 * 前言 前言 == Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解。废话不多说直接贴: 1、任何计算、函数、类型转换 2、!=、<> 3、IS NULL或者IS NOT NULL。类似导致索引失效的还有NOT IN
mysql数据备份恢复
常用两条mysql命令,用于数据库的备份和恢复。 mysqldump -uroot -p db > db.sql mysql -uroot -p --default-character-set=utf8 db < db.sql 来源:[https://nanjishidu.me/2016/03/mysql-backup.html
Jitamin
安装环境要求 ------ * [PHP](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.php.net%2F) 5.6或更高(推荐使用PHP7) * 数据库, 推荐使用[MySQL](https://www.oschina.net/action/GoToLink?url=
MongoDB凭什么跻身数据库排行前五?
DB-Engines 数据库流行度排行榜发布了5 月份的数据,前六名的排名“千年不变”,分别是:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、MongoDB 和IBM Db2。而其中,MongoDB以比去年同期超出65.96分的成绩继续雄踞榜单前五,这个增幅在全榜仅次于PostgreSQL的77.99,而其相对于4
Mycat分布式架构之Mycat入门到精通
支持SQL92标准 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。 支持Galera for MySQL集群,Percon
PostgreSQL 学习一 安装和入门
自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选。     本文介绍PostgreSQL的安装和基本用法,供初次使用者上手。以下内容基于Debian操作系统,其他操作系统实在没有精力兼顾,但是大部分内容应该普遍适用。     ![640x220](http://static.oschina.net/uploads/
PostgreSQL 的进程通信的血管在哪里?
![](https://oscimg.oschina.net/oscnet/40d8680f-df62-48ea-ba3f-c83cc9348e60.png) 最近有人私信我,说postgresql 没有希望,好吧, 其实我倒是觉得,与其说他没有希望,不如好好的了解他后,在说出点什么,而不是人云亦云,然后就么有希望,在我的印象里面  MYSQL 10年前也
PostgreSQL与MySQL比较
特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。 通过执行 Postmaster 进程(pg\_ctl)启动实例。一个实例可以管理一个或多个数据库,这些数据库组成一个
PostgreSQL从继承到分区(二)
二、Partitioning\_table ===================== 2.1 关于分区表 --------- 借助表的继承特性PostgreSQL实现了分区表功能,虽然相比Oracle、MySQL的分区表来说其实现过程比较麻烦,但是这种方式同样能达到分区的效果,而且对大表的查询优化效果很明显。 PostgreSQL的分区表概念与其它数
Postgresql部署及简单操作
PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS),在开源数据库使用上与MySQL各领风骚。 但也有不少人质疑postgresql的未来,正所谓,赞扬或批判一种数据库都必须先了解它,然后才可有话语权。 为了更多的了解postgresql,我们就先部署一套实例作为了解它的基础。 ![](https://oscimg.oschina
Python是怎么连接MySQL数据库和怎么操作MySQL
python操作mysql数据库 Python 规范数据库接口为 Python DB-API,Python DB-API为开发人员供应了数据库运用编程接口。 Python 数据库接口支撑非常多的数据库,你可以选择合适你项目的数据库: GadFly mSQL MySQL PostgreSQL Microso