ruby-on-rails - NoSQL 优势

标签 ruby-on-rails ruby nosql redis

为什么说 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存储,但是这段代码在结构上怎么可能比设置一些followship表更快呢?核心符号表的实现是建立在数组之上的,数组可以被认为是 SQL 表 ID。

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

最佳答案

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

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

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

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

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

*) 不是全部,有异常(exception)

关于ruby-on-rails - NoSQL 优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22157909/

相关文章:

ruby-on-rails - 如何使用AR验证消息生成Rails链接

ruby-on-rails - Rails API 应用程序 : (No MethodError) when I run foreman start

sql - 按数据间隔分组

分布式系统中的MySQL分片和分区

javascript - Parse.com LEFT JOIN 替代方案

ruby-on-rails - Rspec:测试实例变量的赋值

ruby-on-rails - Rails where not 是找不到 nil 值

ruby-on-rails - 连接到 Vagrant 上的主机 MySQL 服务器

ruby-on-rails - Elastic Beanstalk Ruby/Rails 需要安装 git 所以 bundle install 可以工作..但不是

sql - Ruby 构建 .where 超过两个类