mongodb查询非常慢,即使它命中索引并且没有扫描顺序

时间:2012-08-07 14:11:30

标签: mongodb indexing

Mongodb版本是2.0。

我有这样的结构集合:

  {
  "_id" : ObjectId("4fc1225eec13839b46f400e4"),
   "wb" : {
    "trip_plan" : [{
         "op_sta" : "242H",
         "in_tm" : ISODate("2012-07-30T018:00:00Z"),
         "out_tm" : ISODate("2012-07-30T19:02:00Z"),
      }, {
         "op_sta" : "10563",
         "in_tm" : ISODate("2012-07-30T20:00:00Z"),
         "out_tm" : ISODate("2012-07-30T21:00:00Z") 
       }, {
         "op_sta" : "10451",
        "in_tm" : ISODate("2012-07-31T06:00:00Z"),
        "out_tm" : ISODate("2012-07-31T08:00:00Z"),
      }]
  }
}

trip_plan arr很大。平均长度约为30-40。但我无法在2.0版本中获得匹配的记录。 我的应用程序是一种重写应用程序。

收集统计数据如:

   {
    "ns" : "itcp.car_location",
    "count" : 476509,
    "size" : 11794651412,
    "avgObjSize" : 24752.21121112088,
    "storageSize" : 13324562416,
    "numExtents" : 34,
    "nindexes" : 17,
    "lastExtentSize" : 2146426864,
    "paddingFactor" : 1.009999999878954,
    "flags" : 0,
    "totalIndexSize" : 2178233568,
    "indexSizes" : {
        "_id_" : 22418592,
        "wb.wb_sn_1" : 19516112,
        "next_wb.wb_sn_1" : 7914368,
        "wb.trip_plan.op_sta_1_wb.trip_plan.in_trn_1_wb.trip_plan.in_orgn_dt_1" : 315757120,
        "next_wb.trip_plan.op_sta_1_next_wb.trip_plan.in_trn_1_next_wb.trip_plan.in_orgn_dt_1" : 84065632,
        "wb.trip_plan.op_sta_1_wb.trip_plan.out_trn_1_wb.trip_plan.out_orgn_dt_1" : 319387264,
        "next_wb.trip_plan.op_sta_1_next_wb.trip_plan.out_trn_1_next_wb.trip_plan.out_orgn_dt_1" : 95487504,
        "last_op-last_evt_type-status"" : 30758112,
        "modify_ts" : 22091552,
        "ActlInTrn" : 245263648,
        "ActlOutTrn" : 243301408,
        "eq_nr_init" : 23105376,
        "event_os_trn_orgnDt" : 97719552,
        "wb_ibTrn_os_ts" : 255475472,
        "wb_obTrn_os_ts" : 243056128,
        "next_wb_ibTrn_os_ts" : 76658176,
        "next_wb_ObTrn_os_ts" : 76257552
    },
    "ok" : 1
}

我的索引是这样的:

wb_obTrn_os_ts       
{
"wb.trip_plan.op_sta" : 1,
"wb.trip_plan.out_tm":1
}

当我通过以下

进行查询时
 db.car_location.find({ "wb.trip_plan": {$elemMatch: {"op_sta" :"148H",  
        "out_tm" : {$gt: ISODate("2012-08-02T04:00:00.000Z"),       
        $lt: ISODate("2012-08-03T04:00:00.000Z")}}}} ).explain();
... ... {
    "cursor" : "BtreeCursor wb_obTrn_os_ts",
    "nscanned" : 45624,
    "nscannedObjects" : 45624,
    "n" : 2889,
    "millis" : 378954,
    "nYields" : 3858,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "wb.trip_plan.op_sta" : [
            [
                "148H",
                "148H"
            ]
        ],
        "wb.trip_plan.out_tm" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
}

我的mongodb服务器RAM是16G。 从解释,你可以看到它命中索引,没有scanAndOrder。 获得结果需要很长时间!! 我已经被这个问题封锁了好几天!!

非常感谢您的救援!!

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn            set repl       time
     1     50     26      0       6      48       0  76.3g   154g  11.9g    223     15.3          0       8|3     9|3   147k   525k    74 abc2g_repl_set    M   11:48:33
     0     57     40      0       3      44       0  76.3g   154g  11.9g    158     12.4          0       6|4     8|4   101k   624k    74 abc2g_repl_set    M   11:48:34
     0     43     30      0       2      36       0  76.3g   154g  11.9g     84     13.2          0       5|1     7|1    93k   442k    74 abc2g_repl_set    M   11:48:35
     0      5      6      0       6      17       0  76.3g   154g    12g    281      2.4          0       1|1     6|0    13k    63k    74 abc2g_repl_set    M   11:48:36
     0     38      9      0       7       8       0  76.3g   154g  12.1g    256      2.1          0       0|0     5|0    41k   183k    74 abc2g_repl_set    M   11:48:37
     0     44      0      0       0      29       0  76.3g   154g  12.1g    359        0          0       0|0     5|0     5k   208k    74 abc2g_repl_set    M   11:48:38
     0     17      0      0       0       1       0  76.3g   154g  12.1g    316        0          0       0|0     6|0     1k    74k    74 abc2g_repl_set    M   11:48:39
     0     27      3      0       2      11       0  76.3g   154g  12.2g    225      0.3          0       3|0     5|0    12k   161k    74 abc2g_repl_set    M   11:48:40
     0     29      5      0       4      11       0  76.3g   154g  12.2g    275      3.2          0       0|0     5|0    24k   251k    74 abc2g_repl_set    M   11:48:41
     0     42      7      0       6      27       0  76.3g   154g  12.2g    197     12.4          0       0|0     5|0    14k   245k    74 abc2g_repl_set    M   11:48:42

我应该注意哪部分信息?

1 个答案:

答案 0 :(得分:0)

@Johny Wang

你能解决这个问题吗? 这里有几个快速查询/尝试你可以做

  1. 你真的想要$ elemMatch吗? (你最了解它的结构!)
  2. 你可以试试聚合吗?当在两个不同的字段上使用$和$ elemMatch时(在复杂查询中)Mongodb查询优化器表现得很奇怪。您可以尝试对这两个操作进行流水线操作,它将是超高速的(至少在我的大多数查询中都是类似的!)