SQL vs NoSQL:为满足您的业务需求选择正确的数据库模型( 二 )


  • 大结果集 → 在执行连接操作时,如果连接的表之间有许多匹配行,结果集可能会显着增长 。这可能导致更大的中间结果集需要处理、传输和存储,从而增加了内存消耗和较长的查询执行时间 。
  • 缺乏索引使用 → 有效的连接操作通常依赖于连接列上适当索引的使用 。如果缺少或未正确定义必要的索引以及外键,数据库可能需要执行完整的表扫描或大量的磁盘I/O操作来定位匹配的行,从而导致性能较慢 。

SQL vs NoSQL:为满足您的业务需求选择正确的数据库模型

文章插图
  •  复杂的查询计划 → 数据库优化器需要确定执行连接查询的最有效方法 。在某些情况下,查询优化器可能需要考虑多个可能的连接路径、表访问方法和连接算法 。这个过程可能变得复杂且耗时,特别是对于具有多个连接的查询,可能导致次优查询计划和较慢的执行 。
  • 选择性不足 → 包括非选择性谓词(匹配大部分数据的条件)的连接条件可能阻碍性能 。非选择性连接条件可能导致更大的中间结果集和较慢的查询执行,因为数据库需要处理大量数据以检索所需的结果 。
为了解决这些问题,您可能希望扩展数据库,这将导致下一个问题 。
DB实例的水平扩展难题扩展数据库有两种方法:
  • 垂直扩展 → 通过增加现有数据库机器的CPU或RAM
  • 水平扩展 → 通过向数据库集群添加其他机器,每台机器处理总数据的一个子集 。
但是,您最终会达到垂直扩展的极限 。在这一点上,您可能希望考虑水平扩展 。但是,这会引入一套自己的挑战 。
  • 数据分发和分片 → 在水平扩展时,跨多个节点分发数据至关重要 。在SQL数据库中,数据通常以具有关系和依赖关系的表结构化 。拆分和分发这样相互关联的数据可能会很复杂,因为维护引用完整性并确保节点之间的一致数据变得具有挑战性 。通常会使用分片技术来将数据分区到节点上,但需要仔细规划,可能会引入额外的复杂性 。
  • 查询协调和连接 → SQL数据库支持复杂的JOIN操作,以从多个表中检索数据 。当数据分布在节点之间时,执行JOIN操作变得更加具有挑战性 。连接可能需要节点之间的协调、网络数据传输和增加的网络延迟,可能影响性能和可伸缩性 。
  • 索引和查询优化 → SQL数据库在高效的数据检索方面严重依赖于索引 。随着水平扩展,索引变得更加复杂,因为需要在节点之间分布和维护索引 。由于数据的分布性质,查询优化技术也变得更加具有挑战性,可能影响查询性能 。
水平扩展在您可以分区单个请求可以由单个机器/节点处理的方式时效果最佳 。
通过NoSQL数据库解决方案NoSQL数据库尝试解决关系数据库提出的这些主要问题 。
  • 与所有著名的连接存在问题
  • 查询性能的不可预测性
  • DB实例的水平扩展难题
解决连接让我们迅速了解NoSQL在这里试图解决什么 。
SQL依赖于规范化来进行数据建模 。
规范化是数据库设计中的一个过程,通过它来组织和结构化数据,以最小化冗余,提高数据完整
性,并优化数据库效率 。它涉及将数据分解为较小、更可管理的实体(表),并在它们之间建立关系 。
它旨在通过只在一个地方存储每个数据片段来消除冗余 。这以以下方式使我们受益: