MongoDB对600k对象执行不良操作,替代DB?优化?

时间:2011-03-08 00:52:05

标签: mongodb node.js

我使用node.js和mongodb开始了一个新项目,差不多2天后,我在MongoDB中收集了大约600k个对象。我已经注意到对性能的巨大(负面)影响,我开始担心我是否应该尽可能地移动到另一个数据库,或者我是否应该坚持使用Mongo并进行一些(更多)优化。 / p>

基本上我存储这样的坐标:

[x1] => 687
[y1] => 167
[x2] => 686
[y2] => 167
[c] => 0
[s] => 0
[m] => 1299430700312
[_id] => MongoId Object (
    [$id] => 4d73bd2c82bb5926780001ec
)

不多......我的查询看起来像这样:

{'$or': [ { x1: {'$gte' : 0, '$lt' : 1000 }, y1: {'$gte' : 0, '$lt' : 1000 } , { x2: {'$gte' : 0, '$lt' : 1000 }, y2: {'$gte' : 0, '$lt' : 1000 } } ] }

我尝试为每个字段设置索引:x1,y1,y1,y1以及:{x1:1,y1:1},{x2:1,y2:1}。 此外,我还只提取了我需要的必填字段......但是,执行结果集约为40k的查询仍然在2-8secs的运行时间内完成。 顺便说一句:在PHP中执行相同的查询会因内存不足的消息(256MB RAM)而死亡。

该机器是Intel(R)Core(TM)i7 CPU 920 @ 2.67GHz,带有8GB RAM,它不是机架中最尘埃的机器;)

我真的没有想法,我看到接下来几周会有数百万行出现。你可能已经注意到行数相对较小。 带分区的MySQL会表现得更好吗?还有其他NoSQL DB吗?

请唠叨“2-8秒不慢” - 它已经成为一个问题。当几个未缓存的请求同时到达机器时,负载最多会增加4个,少于10个用户访问它。

2 个答案:

答案 0 :(得分:9)

感谢所有花时间思考我的问题的人。使用地理空间索引的建议似乎是我正在寻找的答案。 除了索引对mongodb更有效之外,查询整个盒子的方式只是摇滚!

提供一些事实: 我刚刚开始重写我的代码和集合数据,并从一个简单的比较开始。我之前的数据看起来像这样:


[x1] => 190
[y1] => 18
[x2] => 192
[y2] => 18
[c] => 0
[s] => 0
[b] => Array (
    [0] => 0
    [1] => 0
)
[m] => 1299365242802
[r] => 32596
[_id] => MongoId Object (
    [$id] => 4d72bd7af0528ea82f000003
)

索引是:


{x1:1,y1:1}, {x2:1,y2:1}

现在我的数据如下:


[_id] => MongoId Object (
    [$id] => 4d825799b15953b90d000000
)
[coords] => Array (
    [x] => 190
    [y] => 18
)
[x2] => 192
[y2] => 18
[s] => 0
[c] => 0
[m] => 1299365242802
[r] => 32596

指数:


{coords:'2D'}

我比较了两个脚本。 首先从旧集合中查询一个400x400像素的框,然后执行:



real    0m0.375s
user    0m0.348s
sys     0m0.021s


第二个脚本使用索引和查询同一个框但使用地理空间索引:

real    0m0.107s
user    0m0.096s
sys     0m0.012s

这是一个巨大的差异,我的收藏品(每个)中只有大约3200个对象。我的实时数据库/集合现在已经包含大约200万个对象(在线12天后)。我迫不及待地想用这些脚本对实时数据进行基准测试。它对我来说很有希望! :)

谢谢大家,Stackoverflow摇滚! )

答案 1 :(得分:0)

提高性能(牺牲内存/空间)的快速而肮脏的方法是index“x1”,“x2”,“y1”和“y2”,但也许你应该使用{{ 3}}