2013-02-05 32 views
1

我有大約4000萬個文檔(〜10GB)的文檔集合。這個集合中的文檔相當小(約1000字節)。主要感興趣的領域如下:MongoDB中的大型集合的範圍查詢

start_x  integer 
end_x  integer 

我有一個查詢返回一個給定值的x行。對於x的值,集合中只能有一個匹配行。我正在使用以下選擇器爲此目的:

"start_x"=>{"$lte"=>1258}, "end_x"=>{"$gte"=> 1258} 

我沒有得到預期的查詢性能。我從一個複合索引開始(start_x = 1,end_x = 1)。查詢計劃顯示大約400K nscanned

{ 
    "cursor"=>"BtreeCursor start_x_1_end_x_1", 
    "nscanned"=>417801, 
    "nscannedObjects"=>1, 
    "n"=>1, 
    "millis"=>3548, 
    "nYields"=>0, 
    "nChunkSkips"=>0, 
    "isMultiKey"=>false, 
    "indexOnly"=>false 
} 

隨後,我在start_x和end_x字段中添加了獨立索引。查詢計劃沒有顯示太多的改進。

  • 爲什麼indexOnly不是真的,即使我有一個複合索引和查詢中使用的所有字段被索引覆蓋?

  • 有沒有一種方法來優化此查詢?

回答

0

我最終在end_x字段上使用索引查找來解決此問題。

  • 掉在了收集
  • 增加了ASC指數end_x領域的所有指標。
  • 查詢的第一個匹配行與頂部結合等於或給定值以上

    row = Model.where(:end_x.gte => 1258).asc(:end_x).limit(1).first 
    
  • 檢查,以確保返回的行確實匹配範圍

    row = (row.present? and 1258.between?(row.start_x, row.end_x)) ? row : nil