为什么NoSQL在结构上比某些SQL db更快?假设我在某个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内存存储,它怎么能持续存在?
答案 0 :(得分:4)
某些* NoSQL数据库在某些*操作中比某些* SQL数据库更快的原因是因为它们中的一些*工作起来要简单得多。多年来,一些*关系数据库管理系统积累了大量的功能蠕变。大多数*关系数据库不仅仅是数据表。它们具有自动优化索引,事务,外键关系,约束,触发器,存储过程,强制一致性,智能视图,奇异数据类型,深奥查询命令等等。
为了进行比较:Redis目前大约有20,000行代码。另一方面,MySQL现在超过150万LoC!不要误会我的意思,所有这些功能都有其存在的理由。但他们都不是免费的。它们都需要权衡,这使得其他*操作变慢。
另一方面,大多数* NoSQL数据库是新的开发项目,它们将所有这些复杂性抛在脑后,只关注最重要的事情:通过索引快速检索信息。这种简单性使得一些* NoSQL数据库最初看起来更快更有效。但请记住,这些是有代价的:当您真正需要许多*关系数据库提供的这些功能时,您通常必须通过非常复杂的查询或通过进行多个查询并在应用程序级别完成其余操作来复制它们。对于某些*用例,这可能会使某些* NoSQL数据库更慢。
底线:NoSQL数据库只是工具箱的更多工具。也许你有一些问题比他们的旧工具更好地解决了。但是其他问题可能更适合您的旧工具。
关于RAM存储和持久性在一个数据库中的共存:这些*数据库通常在RAM中执行写操作,报告成功(或失败)并在以后保留这些更改。读操作首先从RAM提供,只有在没有找到信息时才能看到硬盘驱动器。这提高了最近访问数据的写入和查找速度的响应性,但是在突然崩溃的情况下存在丢失最新数据的风险。
*)并非所有,都有例外