MongoDB - 查找需要花费大量时间的查询

时间:2014-10-14 14:19:53

标签: mongodb

以下是 db.mycoll.find({MY_FIELD:“FALSE”})。explain()返回 -

"cursor" : "BtreeCursor MY_FIELD_1",
"isMultiKey" : false,
"n" : 843392,
"nscannedObjects" : 843392,
"nscanned" : 843392,
"nscannedObjectsAllPlans" : 843392,
"nscannedAllPlans" : 843392,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 17798,
"nChunkSkips" : 0,
"millis" : 636733,
"indexBounds" : {
    "MY_FIELD" : [
        [
            "FALSE",
            "FALSE"
        ]
    ]
},
"server" : "db-2:30000",
"filterSet" : false

这是 db.mycoll.stats()返回的内容 -

"ns" : "810.mycoll",
"count" : 1052404,
"size" : 4052704096,
"avgObjSize" : 3850,
"storageSize" : 4841168896,
"numExtents" : 24,
"nindexes" : 5,
"lastExtentSize" : 1257897984,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 215903632,
"indexSizes" : {
    "_id_" : 38484432,
    "fieldA_1" : 42155456,
    "fieldB_1_MY_FIELD_1" : 54255936,
    "fieldC_1" : 42343504,
    "MY_FIELD_1" : 38664304
},
"ok" : 1

我的证词是 -

  1. 即使我的MY_FIELD有索引,为什么还需要10分钟(636秒)?
  2. 我该如何解决这个问题?无论如何发现花费更少的时间?
  3. 我知道的东西 -

    1. 此数据库没有争用(读/写)。它总共有大约100万个文档。
    2. MY_FIELD只有两个可能的值
    3. 这是 mongostat 数据

      insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
          *0      7    436     *0       0     7|0       0   304g   610g  2.12g     40   810:5.6%          0       0|0     3|1   257k   521k    21   20:39:35 
          *0      1    179     *0       0     3|0       0   304g   610g  2.12g     11   810:0.0%          0       0|0     1|1    99k   520k    21   20:39:36 
          *0     *0     53     *0       0     3|0       0   304g   610g  2.12g      3  1273:8.7%          0       1|0     1|1    28k     1m    22   20:39:37 
          *0     *0    805     *0       0     2|0       0   304g   610g  2.12g     44   810:0.0%          0       1|1     2|1   440k   519k    21   20:39:39 
          *0   2966    112     *0       0     1|0       0   304g   610g  2.12g     12   810:2.6%          0       0|0     1|1    63k   518k    21   20:39:40 
          *0      1    398     *0       0     1|0       0   304g   610g  2.12g      9   810:0.0%          0       1|0     1|1   238k   520k    21   20:39:41 
          *0     *0    987     *0       0     1|0       0   304g   610g  2.13g    101   810:0.0%          0       1|2     2|1   612k   518k    21   20:39:42 
          *0     11     86     *0       0    10|0       0   304g   610g  2.13g     17   
      

1 个答案:

答案 0 :(得分:1)

虽然查询可能使用索引,但构建文档需要时间。 explain显示"indexOnly" : false,这意味着索引不是覆盖索引(请参阅http://docs.mongodb.org/manual/reference/method/cursor.explain)。

你可以试试这个。如果您将查询更改为:

db.mycoll.find( {MY_FIELD: "FALSE"}, {_id: 0, MY_FIELD: 1} ).explain()

然后MY_FIELD本身的索引可用于构建结果。检查这是否运行得更快。显然,这个查询可能对你没有多大用处,因为这不会给你返回文件。这只是为了弄清楚是否花费了时间来构建文档而不是搜索本身。

此外,如果MY_FIELD只有两个值,那么最好使用布尔值而不是字符串。文档大小和索引会更小。