【数据蒋堂】第42期:RDB与NoSQL的访问性能

简介:

1185644d0e349d1a76b77f4e54df9251481d92ff

我们继续从软件角度上看外存数据源的性能,来考察数据库的性能特点,在这篇文章中,我们只关心数据的访问性能,而不涉及计算性能。

关系数据库

关系数据库也是很常见的数据存储方式。本质上讲,数据库其实也是一种特殊的二进制文件,但它的性能会弱于直接写在操作系统下的文件,主要原因在于数据库通常都要提供数据更新的能力,这就会产生影响性能的因素:

1. 紧凑性与压缩手段

数据库要考虑数据的更新,一般会采用段页式的分块存储,在存储数据时不会把分块完全填满,而会留一小部分空白区用于后续的修改动作。这样,占用的硬盘空间就会比不考虑更新动作的文件更大一点。

因为要更新数据,也很难实现数据压缩。比如上一篇所说的把小整数存成较短字节的方案,如果采用了这种方案,一旦这个小整数被改成了大整数,原来的空间就存不下了,就要把后续数据都向后移动,这会使数据更新成本过高,所以一般数据库都不采用压缩手段,而直接根据数据类型分配空间,也会造成空间的浪费,极端情况会出现占用空间大于文本的现象。

2. 事实一致性带来的复杂性

许多商业数据库还会同时支持OLTP业务,在读取数据时要提供一致性的能力,这会使访问数据的动作复杂度变大很多。同一条数据,由于其它事务的写操作,可能出现多个备份,在读取时数据库要根据事务的启动时刻找到正确的那一个,这是个非常麻烦的动作,对性能影响很大。

fe940c3326ce4e2272e43f78f05cc8248695a5fa

另外,前面文章还提到过,按块存储的结构对于分段也不够自由,不象文件那样可以实施更灵活的并行手段,也会导致数据库的性能表现弱于直接 文件。

数据库普遍还有一个IO性能不佳的问题,数据在数据库中运算时性能尚可,但要通过数据库接口取出来就非常慢,实测的情况表明,这个性能经常可能会比用文本存储还慢。对于这个问题,在数据库本身负担不重时,可以采用并行取数的方法来解决,具体细节及代码我们将在以后再详述。

NoSQL数据库

NoSQL常常被用作大数据处理,但是,它真地能获得高性能吗?

这要分情况,看进行什么样的处理。

NoSQL产品一般都不提供事务一致性的能力,这是在数据访问时的动作要比关系数据库简单了许多,不需要考虑回滚段、多备份等问题。而且,放弃事务的NoSQL一般也更容易横向扩展,使用更多机器来承载更大的业务量。在这方面,NoSQL确实会有更高的性能,特别是高并发写入时的优势要比关系数据库大得多。

不过,对于单纯的分析型业务,却不完全是这样。

许多分析型关系数据库也不考虑事务一致性的问题,访问动作同样也较为简单。NoSQL不处理事务一致性带来的性能优势,与这些分析型数据库比并没有特别的地方。

bcfcc2047ddabdc68627559540c5d899bfa38d64

NoSQL产品常常使用Key-Value型存储组织,Value的随意性会带来结构多样性的好处,即使用NoSQL存储数据时不需要事先确定数据结构,不象关系数据库那样必须先建个有特定数据结构的表才能使用,这是NoSQL非常方便的地方。

但是,多样性和高性能是一对天生的矛盾

多样性意味着每条记录的数据结构都可能不一样。在存储数据时同时也要存储结构,增大了存储量,在解析数据时也要去匹配数据结构中的字段,增加大了复杂度。而关系数据库中同一表的数据结构是确定且相同的,结构只要存储一份,解析数据时的字段对应也非常简单,当数据量很大时,这个优势就会非常明显。

大多数Key-Value式的NoSQL产品,只是在用Key寻找Values时性能很好(这只要有个Hash索引就能够用Key找到对应的记录,关系数据库建了索引也可以),但面临需要对数据遍历才能完成的计算时(比如过滤条件不是针对Key的),它的性能就会远远低于确定数据结构的关系数据库。把NoSQL用于高性能大数据分析业务是个错误的选择,但现实中却经常有人在这么用。

原文发布时间为:2018-02-12

本文作者:蒋步星

本文来自云栖社区合作伙伴“数据蒋堂”,了解相关信息可以关注“数据蒋堂”微信公众号

相关文章
|
25天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
114 1
|
29天前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
1月前
|
SQL 存储 JSON
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
亲爱的社区小伙伴们,Apache Doris 2.1.0 版本已于 2024 年 3 月 8 日正式发布,新版本开箱盲测性能大幅优化,在复杂查询性能方面提升100%,新增Arrow Flight接口加速数据读取千倍,支持半结构化数据类型与分析函数。异步多表物化视图优化查询并助力仓库分层建模。引入自增列、自动分区等存储优化,提升实时写入效率。Workload Group 资源隔离强化及运行时监控功能升级,保障多负载场景下的稳定性。新版本已经上线,欢迎大家下载使用!
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
|
1月前
|
SQL 开发框架 JavaScript
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
49 3
|
21天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
1月前
|
SQL Java 数据库连接
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
17 0
|
19天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
3天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
24 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
5天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
12 1
|
6天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为'张三',`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, '张三', 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES ('张三', 20)`。
5 2