zoukankan      html  css  js  c++  java
  • 在MongoDB中一起使用$or和sort()时,查询性能可能会很差

    首先看一下操作过程:

    mongos> db.find({ "user" : "jhon"}).sort({"name" : 
    1}).limit(100).explain()
    {
    "cursor" : "BtreeCursor user_1",
    "nscanned" : 10100,
    "nscannedObjects" : 10100,
    "n" : 100,
    "scanAndOrder" : true,
    "millis" : 116,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
    "user" : [
    [
    "jhon",
    "jhon"
    ]
    ]
    }
    }

    Second, I do $or query with sort():
    mongos> db.find({ "$or" : [ { "user" : "jhon"} , { "owner" :
    "jhon"}]}).sort({"name" : 1}).limit(100).explain()
    {
    "cursor" : "BtreeCursor name_1",
    "nscanned" : 1010090,
    "nscannedObjects" : 1010090,
    "n" : 100,
    "millis" : 3800,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
    "name" : [
    [
    {
    "$minElement" : 1
    },
    {
    "$maxElement" : 1
    }
    ]
    ]
    }
    }

    Last, I do $or query without sort():
    mongos> db.find({ "$or" : [ { "user" : "jhon"} , { "owner" :
    "jhon"}]}).limit(100).explain()
    {
    "cursor" : "BtreeCursor user_1",
    "nscanned" : 100,
    "nscannedObjects" : 100,
    "n" : 100,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
    "user" : [
    [
    "jhon",
    "jhon"
    ]
    ]
    }
    }

    可以看出:

    第一次查询中, 单独使用sort()时性能很好。

    第二次查询中,联合使用了$or和sort()时,性能很差。

    第三次查询中,单独使用$or,性能很好。

    后来在官方论坛中提问,得知有一个bug:https://jira.mongodb.org/browse/SERVER-1205

    将来会修改,今天先记录一下。

    论坛回复:

    I believe the issue you are running into is expressed in this JIRA 
    ticket: https://jira.mongodb.org/browse/SERVER-1205 

    I believe the query optimizer is choosing to use the name index and 
    walk it backwards. As it goes through the index it compares the user 
    and owner attributes to your parameters and collects them in sorted 
    order. As a result the nscanned objects is much larger than in the 
    other two cases. 

    I would vote up the issue to prioritize it. 

    -Tyler

    原帖地址:http://groups.google.com/group/mongodb-user/browse_thread/thread/58428702d9485b8/40d6db4604a95a69?lnk=gst&q=gen+liu+%24or#40d6db4604a95a69

    注:如果查询中使用了$or,并且查询元素有索引的话,那么也会使用该元素的索引的。换句话说,如果查询中只有$or时(无sort时),不会出现这里的问题。另外在使用$and和$or的组合时也发现了类似的问题。



  • 相关阅读:
    危险无处不在 Html标签带来的安全隐患
    【转】服务器不支持FLV的解决办法
    IE8采用IE7模式
    解决IE中img.onload失效的方法
    字符串操作>静态串String
    装sql2005 express
    抽象类
    字符串操作>动态串StringBuilder
    使用数组
    集合>数组集合ArrayList
  • 原文地址:https://www.cnblogs.com/xinghebuluo/p/2270590.html
Copyright © 2011-2022 走看看