【问题标题】:MongoDB $IN query performance issueMongoDB $IN 查询性能问题
【发布时间】:2013-09-09 16:04:53
【问题描述】:

感谢大家的帮助。

我有一个包含此统计信息的集合 我有 7 亿条类似这样的记录

db.flight_availability.findOne() { “_id”:ObjectId(“5226465fc3b53d4f249c19fc”), “航班号”:9803, “到达”:1384819200, “持续时间”:1, “容量”:1, “房间”:1, “最低价格”:163, “min_price_packaged”:50, “rates_has_wifi”:1, “rates_has_baby_cot”:1, “rates_has_pets_allow”:1, “埃兰克”:0.25 }

当我进行查询时,我只对 4 个字段进行查询,因此我构建了一个看起来像这样的索引 db.flight_availabillity.ensureIndex({"flight_id":1,"arrival":1,"duration":1,"capacity":1,"rooms":1})

问题: 仅发送 1 个航班 id 时 find({"flight_id":{$in:[236]}) 结果很快就出来了

当使用多个航班 ID 时 find({"flight_id":{$in:[236,232,545,757]}) (而且我在查询中最多可以有 1000 个航班 ID)。我得到较慢的结果。

这是其中一个耗时 3.5 秒的解释,但我也有几个 10 秒

db.flight_availability.find({"flight_id":{$in:[333,207731,33993,277,127,183345,169019,156473,92715,5046,2927,2473,2112,2024,281,264,185,125,95, ,208065,183074,31774,359,314,64010,56170,5107,4673,147,115571,214,101564,287,66356,128,194487,100,207984,66353]},"到达":13843872" :1,"容量":1,"房间":1}).explain() { "cursor" : "BtreeCursor flight_id_1_arrival_1_departure_1_capacity_1_rooms_1 multi", “isMultiKey”:假, “n”:40, “nscannedObjects”:240, “nscanned”:358, “nscannedObjectsAllPlans”:597, “nscannedAllPlans”:715, “scanAndOrder”:假, “indexOnly”:假, “nYields”:0, “nChunkSkips”:0, “毫”:4, …… }

我想念什么?如何查询并快速获得结果?

谢谢!

【问题讨论】:

  • 您使用的是哪个版本的 MongoDB?我之所以问,是因为以前的版本中有各种错误阻止 $in 使用它本来可以使用的索引。
  • 我用的是2.4.6版

标签: mongodb performance indexing nosql


【解决方案1】:

在某些 MongoDB 版本中,$in 不使用索引 - Mongo 也有一个限制,即对同一查询使用多个索引。

您的查询包括flight_id、到达、持续时间、容量和房间。尝试设置一个包含到达、持续时间、容量和房间的索引,这将为您提供一个选择标准的良好索引,而不是放置所有字段。

flight_id 将只是最终选择,在选择标准已经完成了艰苦的工作之后。

另外,不粘贴 indexBound 也无济于事,它可以提供索引组合是否最优的线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多