【学习资料】第10期数据库选型思考(PostgreSQL,MySQL,Oracle)

简介: 大家好 ,这里是数据库选型思考(PostgreSQL,MySQL,Oracle)

背景


https://www.enterprisedb.com/blog/postgresql-vs-mysql-360-degree-comparison-syntax-performance-scalability-and-features?mkt_tok=eyJpIjoiTVRZMVlqRXlOVFkzWldabSIsInQiOiJBZnQwRmExdzl5VlhWTktBenpDa211TzV6MnJXUGwrTHdNY20yTEw4VnpYUzhzVlZSd2ZLeGxRa1NjRkxlaXJob3ZQNkp1MGZub0gyMU10WDRySE5yRnpVVUFhVVlyNnNzSitGK1oxNlJmZnVYdEtzeXduRzBcL0FHa0dhRVNjdDAifQ%3D%3D

数据库选型是一件很大的事情,也是一件很头疼的事情。

很多企业并没有数据库的选型标准,或者并不了解业务需要什么样的数据库。

很多企业的数据库是开发说了算,熟悉什么就用什么,很多选型失误,导致后期非常尴尬的局面。

那么数据库选型要注意什么呢?

列举一些例子,取自如下文档

《数据库选型的关键指标》

选型维度


功能差异

1. 递归查询, connect by, 树形查询

PostgreSQL 通过(with 或 tablefunc支持)支持例子

https://yq.aliyun.com/articles/240

http://www.postgresql.org/docs/9.5/static/tablefunc.html

2. 窗口查询, window over

PostgreSQL 支持例子

http://blog.163.com/digoal@126/blog/static/16387704020137154137930

http://blog.163.com/digoal@126/blog/static/16387704020121024102312302/

http://blog.163.com/digoal@126/blog/static/16387704020124239390354/

http://www.postgresql.org/docs/9.5/static/functions-window.html

3. rollup, grouping sets, cube

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/queries-table-expressions.html#QUERIES-GROUPING-SETS

http://blog.163.com/digoal@126/blog/static/16387704020154269591874/

4. 高级聚合(json,数组,相关性,标准差(采样,全局),截距,斜率,方差(采样,全局),mode,percentile_cont,distc,rank,dense_rank,percent_rank,cume_dist,grouping)

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/functions-aggregate.html

http://blog.163.com/digoal@126/blog/static/1638770402015224124337/

http://blog.163.com/digoal@126/blog/static/1638770402015379286873/

http://blog.163.com/digoal@126/blog/static/16387704020153713222764

4. hash join, merge join, nestloop join

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/xoper-optimization.html

http://www.postgresql.org/docs/9.5/static/planner-optimizer.html

5. 哈希聚合

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/runtime-config-query.html#RUNTIME-CONFIG-QUERY-ENABLE

6. 事务间共享事务快照

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/functions-admin.html#FUNCTIONS-SNAPSHOT-SYNCHRONIZATION

http://www.postgresql.org/docs/9.5/static/sql-set-transaction.html

http://www.postgresql.org/docs/9.5/static/app-pgdump.html

http://blog.163.com/digoal@126/blog/static/163877040201326829943/

http://blog.163.com/digoal@126/blog/static/163877040201241134721101/

7. 展开式索引(支持多列任意组合查询)

PostgreSQL 支持例子

《宝剑赠英雄 - 任意组合字段等效查询, 探探PostgreSQL多列展开式B树》

约束

1. foreign key

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/ddl-constraints.html

2. for no key update, for key share 粒度锁

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/explicit-locking.html#LOCKING-ROWS

http://blog.163.com/digoal@126/blog/static/16387704020130249109133/

http://blog.163.com/digoal@126/blog/static/16387704020130305109687/

3. check 约束

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/ddl-constraints.html

4. exclusion 约束

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/ddl-constraints.html

易用性

1. 表空间

2. alter 列值转表达式

(alter table alter column c1 type newtype using (expression(...)) )

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/sql-altertable.html

https://yq.aliyun.com/articles/30470

3. alter table 需要重组表的操作

PostgreSQL少量操作需要重组

vacuum full, cluster, 修改字段数据类型, (修改长度不需要重组表)

http://www.postgresql.org/docs/9.5/static/sql-altertable.html

4. 分区表

《PostgreSQL 9.5+ 高效分区表实现 - pg_pathman》

《PostgreSQL 10.0 内置分区表》

5. 物化视图

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/sql-creatematerializedview.html

6. 物化视图增量刷新

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/sql-refreshmaterializedview.html

7. 表继承关系

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/tutorial-inheritance.html

8. 使用 like 建结构类似的表

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/sql-createtable.html

开发功能

1. 客户端开发语言支持

C, java, python, ...

2. 函数

返回 void, 单行,SRF,事件触发器(MySQL 不支持),触发器

例子

http://blog.163.com/digoal@126/blog/static/16387704020132131361949/

http://www.postgresql.org/docs/9.5/static/event-triggers.html

3. 2PC

4. 服务端绑定变量

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/sql-prepare.html

5. savepoint

6. 异步消息

PostgreSQL 支持例子

http://www.postgresql.org/docs/9.5/static/sql-notify.html

http://www.postgresql.org/docs/9.5/static/sql-listen.html

7. 游标

数组FOR循环,query FOR循环,游标FOR循环

PostgreSQL 全面支持例子

http://www.postgresql.org/docs/9.5/static/plpgsql-control-structures.html

http://www.postgresql.org/docs/9.5/static/plpgsql-cursors.html

(MySQL 暂不支持数组)

类型

1. 数据类型

1.1 PostgreSQL

高精度numeric, 浮点, 自增序列,货币,字节流,时间,日期,时间戳,布尔,枚举,平面几何,立体几何,多维几何,地球,PostGIS,网络,比特流,全文检索,UUID,XML,JSON,数组,复合类型,域类型,范围,树类型,化学类型,基因序列,FDW, 大对象, 图像

1.2 MySQL

数字,时间,字符串,简单的GIS,JSON

2. 支持索引的数据类型

2.1 PostgreSQL

高精度numeric, 浮点, 自增序列,货币,字节流,时间,日期,时间戳,布尔,枚举,平面几何,立体几何,多维几何,地球,PostGIS,网络,比特流,全文检索,UUID,XML,JSON,数组,复合类型,域类型,范围,树类型,化学,基因序列

2.2 MySQL

数字,字符串,比特流,时间,全文检索,GIS

索引支持

1. 索引方法

PostgreSQL 支持 btree, hash, gist, sp-gist, gin, brin , bloom , rum 索引

MySQL 支持 btree, gis类型索引

2. 规则表达式、前后模糊查询,支持索引检索

PostgreSQL 支持

3. 数组支持索引

PostgreSQL 支持

4. 全文检索支持索引

5. 索引扩展功能

5.1 PostgreSQL 支持 表达式索引,部分索引,联合索引

5.2 PostgreSQL 支持图像相似度、文本相似度搜索

5.3 自定义索引访问方法(bloom, rum, ......)

PostgreSQL支持

多引擎和外部源支持

1. 多引擎支持

1.1 PostgreSQL

内置heap, 通过插件实现内存表, 列存储, 压缩存储, 流式存储, 非关系存储等。

1.2 MySQL

MyISAM, innodb, ...

2. 外部表

PostgreSQL支持任意外部数据源, (例如jdbc, file, odbc, oracle, mysql, db2, redis, mongo, ES, hadoop......)

https://wiki.postgresql.org/wiki/Fdw

3. dblink

PostgreSQL 支持

4. 内存表

PostgreSQL 通过外部表支持,或者通过插件支持

5. ES(弹性搜索引擎) 引擎

PostgreSQL 支持

安全

1. 数据加密

PostgreSQL 支持加密数据类型,可选GPG加密算法

2. 认证方法

PostgreSQL 支持 密码、LDAP、AD、GSSAPI、SSPI、Ident、Peer、RADIUS、PAM、签名认证

3. 数据传输加密

PostgreSQL 支持

4. 行安全策略

PostgreSQL 支持

5. 数据库内部支持libselinux接口, (美国国家安全局制定的安全加强标准)

PostgreSQL 支持

优化器

http://www.postgresql.org/docs/9.5/static/runtime-config-query.html

1. GPU 并行计算支持

PostgreSQL 支持

2. 遗传优化器算法

PostgreSQL 支持CBO、CRO、遗传算法

3. HINT PLAN

4. CPU 并行计算

PostgreSQL 支持 (线性性能提升)

5. 自定义成本因子

PostgreSQL 支持

编程扩展

1. 是否支持采样查询

PostgreSQL 支持

2. 是否支持扩展采样算法

PostgreSQL 支持

3. 自定义数据类型

PostgreSQL 支持

4. 自定义索引方法

PostgreSQL 支持

5. 字符集自动转换, C扩展接口

PostgreSQL 支持

6. 自定义聚合

PostgreSQL 支持

7. 自定义窗口

PostgreSQL 支持

扩展能力

1. 类型扩展,操作符扩展,函数扩展,索引方法扩展,索引扩展,

PostgreSQL 支持

2. C触发器函数, C事件触发器函数

PostgreSQL 支持

3. 函数语言扩展

PostgreSQL 支持扩展函数支持接口, erlang, ....

4. 机器学习库

PostgreSQL 支持

5. 流式计算

PostgreSQL 支持

性能

《数据库界的华山论剑 tpc.org》

《facebook linkbench 测试PostgreSQL社交关系图谱场景性能》

《PostgreSQL 主机性能测试方法 - 单机多实例》

《PostgreSQL 主机性能测试方法 - 单机单实例》

《PostgreSQL 源码性能诊断(perf profiling)指南》

《"物联网"流式处理应用 - 用PostgreSQL实时处理(万亿每天)》

《PostgreSQL 百亿地理位置数据 近邻查询性能》

《PostgreSQL 百亿数据 秒级响应 正则及模糊查询》

《PostgreSQL 1000亿数据量 正则匹配 速度与激情》

《恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计》

《从难缠的模糊查询聊开 - PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》

《分析加速引擎黑科技 - LLVM、列存、多核并行、算子复用 大联姻 - 一起来开启PostgreSQL的百宝箱》

服务端编程语言

1. 函数(过程)语言

PostgreSQL支持几乎所有的地球编程语言,你可以用他们在数据库中编写UDF

plpgsql, sql, c, c++, java, javascript, R, python, perl, php, tcl, ruby, lua, ...

scale out

1. PostgreSQL完全支持以下下推功能

支持聚合算子下推

支持WHERE条件下推

支持JOIN下推

支持SORT下推

支持SELECT 子句下推

支持跨数据源JOIN

scale up能力

PostgreSQL

资源管控能力强。

单实例可以充分发挥HPC的性能,有多少资源就能使用多少资源。

可用性、可靠性

PostgreSQL

PIRT,任意时间点恢复;FPW;

物理、逻辑级流式复制;金融级多副本;

技术储备

社区、生态

社区状态

PostgreSQL

单一开源分支,社区力量较集中。全球有1000名以上的内核研发人员。

社区研发由核心组员和committer组成,持续5年以上对社区版本有贡献内核研发人员超过50位。

社区核心人员分别来自数据库厂商,数据库支持和服务公司,数据库最终用户的公司,形成了一个非常好的力量均衡。

社区活跃度

PostgreSQL

非常活跃(see git.postgresql.org, github.com/postgres)

学习成本

维护成本

平台兼容性

代码成熟度

应用场景、案例

开源许可

全球发展前景

详细文档参考


《数据库选型的关键指标》

《PostgreSQL 生态;原理、案例、开发实践、管理实践、学习资料、视频 - 珍藏级》

https://www.2ndquadrant.com/en/blog/postgresql-is-the-worlds-best-database/



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
939 6
|
11月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
320 6
|
11月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
193 1
|
11月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
209 0
|
11月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
285 0
|
11月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
190 0
|
11月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
250 0
|
Oracle 关系型数据库 数据库
【赵渝强老师】在PostgreSQL中访问Oracle
本文介绍了如何在PostgreSQL中使用oracle_fdw扩展访问Oracle数据库数据。首先需从Oracle官网下载三个Instance Client安装包并解压,设置Oracle环境变量。接着从GitHub下载oracle_fdw扩展,配置pg_config环境变量后编译安装。之后启动PostgreSQL服务器,在数据库中创建oracle_fdw扩展及外部数据库服务,建立用户映射。最后通过创建外部表实现对Oracle数据的访问。文末附有具体操作步骤与示例代码。
1423 6
【赵渝强老师】在PostgreSQL中访问Oracle
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1506 57
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
SQL 运维 监控
数据库国产化选型?YashanDB 给中大型企业的五个答案
近两年,“国产数据库”成为企业数字化升级的重要议题。YashanDB作为新一代国产关系型数据库,以完整产品矩阵解决企业核心关切:通过图形化工具提升开发效率;提供自动化迁移平台简化数据库切换;云管理工具减轻运维负担;支持复杂业务场景;拥有成熟团队保障企业级服务。YashanDB不仅是“可替代”,更是“更可靠”的选择,助力企业实现高效、可控的数据库升级。

推荐镜像

更多