数据库或数组

时间:2012-10-10 00:24:03

标签: javascript mysql node.js mongodb database

如果我有简单的关系,使用数据库的确切点是什么 (95%的查询取决于ID)。

我正在存储用户及其统计信息。

如果我可以使用像:

这样的简洁结构,为什么我会使用外部数据库?

db.users[32] = something

500K用户的数组对RAM而言并不是那么大的努力

优点是:

  • 没有问题的异步(即时结果)
  • 轻松导出/导入
  • 与本地对象一起处理数据库LITERALLY

PS。和考虑因素:

  • collection[3]db.query("select ...
  • 更快还是更慢?
  • 我将把它存储为文件
  • 只有一个应用程序/进程访问此数据,代码是逐行执行的 - 请不要详细说明锁定。
  • 请不要回答数据库命题,但为什么要使用外部数据库而不是原生数组/对象 - 我在一些数据库中有经验 - 事实并非如此。
  • 我正在构建的是一个客户端/网关/服务器游戏。 Gateway处理所有用户数据,处理,验证,编写统计信息e.t.c软件的其他任何部分都不需要直接访问此数据/数据库。

2 个答案:

答案 0 :(得分:2)

这取决于对数据的持久性,延迟和生命周期的要求。在内存中访问数据结构几乎总是比将网络跳转到外部数据库快得多,但需要考虑的事情。

你可以将它保留在记忆中,但如果你的过程由于某种原因而回收,它就会消失。这对你的场景来说可能没问题......

如果您有多个具有负载平衡的前端/进程(而不是分区)或者没有关联,那么您也会遇到问题。在某些情况下,在内存状态可能会有问题。还有像memcached这样的选项来解决这类问题。

memcached是facebook如何解决这些问题:http://www.facebook.com/note.php?note_id=39391378919

与facebook类似,您也可以将数据保存在数据库中(无论是SQL还是NoSQL,如mongodb),并在内存中缓存以提高效率。如果您在内存中缓存并且它由数据库支持,那么您必须担心该数据的延迟以及如何刷新它。 memcached也是这种场景的解决方案。或者你编写自己的机制来备份数据,进行轮询(尽量避免)等...这实际上是fb正在做的事情 - 使用数据库但是使用分布式内存缓存卸载db load。从那篇文章:

  memcached是一种高性能的分布式内存对象缓存   系统。在Facebook,我们可能是世界上最大的用户   memcached的。我们使用memcached来减轻数据库负载。

答案 1 :(得分:1)

这将是一个比任何事情都更有思想性的答案。你需要考虑的一件事是你的语言。我是一名PHP程序员,我很高兴数据库。

尝试在PHP内存中存储500K用户数组(并对其进行操作)将是一个活生生的噩梦,实际上它可能适用于大多数语言。数据库使用对数时间函数在预定义索引上实现搜索策略以克服此类情况。

您还有成本因素。将它存储在同一台服务器上的MySQL或MongoDB数据库中实际上更便宜,因为您很可能需要更少的内存来保存您的信息。

我会在这样一个数组的负载下认真测试你的内存消耗,我也猜测这只是一个很多的数组吧?

  

收集[3]比db.query(“select ...

”更快还是更慢?

现在这取决于,我不确定node.js如何处理数组和迭代到它们中的特定索引,但有些语言不对索引进行O(log n)搜索,这意味着你只需要做一个O(n)搜索,这实际上比对SQL表的索引的直接调用要慢。足够公平,考虑到SQL创建结果集所需的时间,将其写入磁盘然后响应node.js来获取它,它可能会更慢。

所以node.js肯定会在一个小的索引或对象上更快,但在更大的索引或对象上......我不确定。

  

只有一个应用程序/进程访问此数据,代码是逐行执行的 - 请不要详细说明锁定。

这令人惊讶。在此之前,我已经很容易地启动了多个node.js服务器。事实上,为了保持理想的网络托管环境,如果您的主服务器出现故障,您应该总是有另一台服务器准备好参与其中(相信我会这样做......)。考虑到这一点,我认为你不会在这里考虑锁定和分布式数据的中心存储点,这有点奇怪。