【问题标题】:NoSQL advantagesNoSQL 的优势
【发布时间】:2014-04-05 03:49:04
【问题描述】:

为什么说 NoSQL 在结构上比某些 SQL 数据库更快?假设我在某个 SQL 表的列上添加了一些索引。有人可以提供某种更快的查询吗?

我正在阅读有关 redis 的信息。

class User < ActiveRecord::Base
  def follow!(user)
    $redis.multi do
      $redis.sadd(self.redis_key(:following), user.id)
      $redis.sadd(user.redis_key(:followers), self.id)
    end
  end
....

尽管 redis 有 RAM 存储,但这段代码如何在结构上比设置一些追随表更快?核心符号表实现是基于数组构建的,可以将其视为 SQL 表 ID。

至于RAM redis内存存储,如何持久化?

【问题讨论】:

  • 没有 NoSQL 这样的东西。只是有一大堆新的数据库技术,它们彼此之间没有太大的关系。虽然它们中的一些可以比 SQL 数据库更快地完成某些事情,但也有一些其他的事情,其中​​一些执行得慢得多或根本无法完成。

标签: ruby-on-rails ruby nosql redis


【解决方案1】:

某些* NoSQL 数据库在某些* 操作上比某些* SQL 数据库更快的原因是因为其中一些* 工作更简单。多年来,一些*关系数据库管理系统积累了很多特性。大多数*关系数据库不仅仅是数据表。它们具有自动优化索引、事务、外键关系、约束、触发器、存储过程、强制一致性、智能视图、奇异数据类型、深奥的查询命令等等。

作为比较:Redis 目前大约有 20.000 行代码。另一方面,MySQL 到现在已经超过 150 万个 LoC!不要误会我的意思,所有*这些功能都有其存在的理由。但它们都不是免费的。它们都需要权衡取舍,这会使其他*操作变慢。

另一方面,大多数* NoSQL 数据库是较新的发展,它们已经抛弃了所有复杂性,只专注于最重要的事情:按索引快速检索信息。这种简单性使一些* NoSQL 数据库起初看起来更快、更高效。但请记住,这些都是有代价的:当您真正需要许多*关系数据库提供的这些功能时,您通常必须通过非常复杂的查询或通过进行多个查询并在应用程序级别完成其余工作来复制它们。对于某些*用例,这可能会使某些* NoSQL 数据库变得更慢。

底线:NoSQL 数据库只是您工具箱中的更多工具。也许你有一些问题比你的旧工具解决得更好。但其他问题可能更适合您的旧工具。

关于 RAM 存储和持久性在一个数据库中的共存:那些*数据库通常在 RAM 中执行写操作,报告成功(或失败)并在以后持久化这些更改。读取操作首先从 RAM 提供,只有当在那里找不到信息时,它们才会在硬盘驱动器上查找。这提高了写入的响应能力和最近访问数据的查找速度,但在突然崩溃的情况下有丢失最近数据的风险。

*) 不是全部,也有例外

【讨论】:

  • 最著名的 Nosql 数据库,例如mongodb、nosdb(我都用过)有 Journal。用户操作会立即插入到日志中,因此在数据库崩溃的情况下,操作会被重新应用。使用 Journal 几乎可以消除数据丢失。关于查询,NoSql 的分布式特性使查询处理更快,因为首先查询结果是根据每个节点上可用的少量数据计算的,然后结果在 Query Router 处合并。显然每个节点的数据量较小,因此您可以更快地计算结果。考虑时间复杂度。
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 2012-09-20
相关资源
最近更新 更多