为什么说 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/