MongoDB 在 600k 个对象上表现不佳,替代数据库?优化?

标签 mongodb node.js

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

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

[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-8 秒的运行时间。 顺便说一句:在 PHP 中执行相同的查询时会出现内存不足消息(256MB RAM)。

这台机器是 Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz 和 8GB RAM,它不是机架中灰尘最多的机器;)

我的想法真的快用完了,我预计接下来几周会有数百万行出现。正如您可能注意到的那样,这些行相对较小。 带分区的 MySQL 性能会更好吗?任何其他 NoSQL 数据库?

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

最佳答案

感谢所有花时间思考我的问题的人。使用地理空间索引的建议似乎是我正在寻找的答案。 除了索引对 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 太棒了! )

关于MongoDB 在 600k 个对象上表现不佳,替代数据库?优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227114/

相关文章:

javascript - 使用 express 启用 http 压缩

node.js - 使用 Node.js 登录 Facebook

node.js - 如何在node js中映射json数据数组

concurrency - 有没有办法自动更新 MongoDB 中的两个集合?

mongodb - @SpringBootTest 如何预填充嵌入式MongoDB?

sql - 可以接受客户端 SQL 吗?如果可以,如何验证?

javascript - Bcrypt 不散列

javascript - 解析对象数组并填充表格 View 单元格 Swift

javascript - 如何使用 Node.js 服务器将图像数据从前端保存到 Mongoose 数据库

javascript - 无法将文件复制到目录