MongoDB记录太多了?

Ayu*_*ary 4 php mongodb

我有一个与MongoDB交互的PHP应用程序.直到最近,该应用程序工作正常,但几天前我发现应用程序开始响应真的很慢.其中一个系列已达到500K +记录.因此MongCursor对该集合的任何查询都会保持超时.

我不认为500K记录是太多了.使用mongodb的其他页面也开始变慢,但没有使用具有500k记录的集合的页面.不与MongoDB交互的静态页面仍然可以快速响应.

我不确定这里会出现什么问题.我已将索引编入索引,因此这似乎不是问题.另一点需要注意的是服务器上的RAM规格是512 MB,当PHP执行Mongo时,top命令显示15000k内存空闲.

任何帮助将不胜感激.

Ste*_*nie 7

为了总结聊天室的后续行动,问题实际上与find()查询相关,该查询正在扫描所有~500k文档以查找15:

db.tweet_data.find({ 
    $or: 
    [ 
        { in_reply_to_screen_name: /^kunalnayyar$/i, handle: /^kaleycuoco$/i, id: { $gt: 0 } }, 
        { in_reply_to_screen_name: /^kaleycuoco$/i, handle: /^kunalnayyar$/i, id: { $gt: 0 } } 
    ], 
    in_reply_to_status_id_str: { $ne: null }
} ).explain() 
{ 
    "cursor" : "BtreeCursor id_1", 
    "nscanned" : 523248, 
    "nscannedObjects" : 523248, 
    "n" : 15, 
    "millis" : 23682, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
        "id" : [ 
            [ 
                0, 
                1.7976931348623157e+308 
            ] 
        ] 
    } 
}
Run Code Online (Sandbox Code Playgroud)

此查询使用不区分大小写的正则表达式,这些表达式无法有效地使用索引(尽管在这种情况下实际上没有定义).

建议的方法:

  • 为搜索目的创建小写handle_lc和inreply_lc字段

  • 在那些上添加复合索引:

    db.tweet.ensureIndex({handle_lc:1, inreply_lc:1})

  • 复合索引的顺序允许通过handle或通过(handle,in_reply_to)有效地查找所有推文

  • 通过完全匹配而不是正则表达式搜索:

db.tweet_data.find({ $or: [ { in_reply_to_screen_name:'kunalnayyar', handle:'kaleycuoco', id: { $gt: 0 } }, { in_reply_to_screen_name:'kaleycuoco', handle:'kunalnayyar', id: { $gt: 0 } } ], })