2013-07-25 396 views
0

我有一個名爲Post的集合。我有映射系統總是確保每個文檔具有下列字段:mongoDB索引策略

  • ID(INT)
  • 目標(字符串)
  • 類型(字符串)
  • USER_ID
  • CLIENT_ID
  • 更新(字符串,11 int timestamp)
  • 已創建(字符串,11 int timestamp)
  • enabled(bool)

訪問此集合以在API架構中輸出。

所以一些典型的請求可能是:

/post?type=image&user_id=2 
/post?updated=35234423&order_by=client_id 
/post?enabled=true&order_by=id 

沒有100%的保證某些領域使它的查找或排序字段。

最近當表達8GB數據,我開始收到此錯誤:

"localhost:27017: too much data for sort() with no index. add an index or specify a smaller limit" 

我已經看過了蒙戈索引的文檔,發現它很難理解它是否以同樣的方式可以作爲一個MySQL索引。

我在索引中找到的一些線程:MongoDB - too much data for sort() with no index error似乎建議使用特定的排序字段來確保索引被命中。很顯然,我不能做到這一點,當我的過濾和排序很多是可選的。

任何人都可以提出什麼樣的公司解決方案將是我應該索引我的桌子上的所有領域?


感謝您的反饋傢伙,我已經開始建立一個自動索引功能:

public function get() { 

     $indices['Post'] = array(
      'fields' => 
       array(
        'id'    => array('unique' => true, 'dropDups' => true, 'background' => true), 
        'client_id'   => array('dropDups' => true, 'background' => true), 
        'image_id'   => array('dropDups' => true, 'background' => true), 
        'user_id'   => array('dropDups' => true, 'background' => true), 
        'publish_target' => array('dropDups' => true, 'background' => true), 
        'type'    => array('dropDups' => true, 'background' => true), 
        'status'   => array('dropDups' => true, 'background' => true), 
        'text'    => array('background' => true) 
       ) 
     ); 

     foreach ($indices as $key => $index) { 

      /* set the collection */ 
      $collection = $this->mongoDB->{$key}; 

      /* delete the indexes */ 
      $collection->deleteIndexes(); 

      /* loop the fields and add the index */ 
      foreach ($index['fields'] as $subKey => $data) { 
       $collection->ensureIndex($subKey, array_merge($data, array('name' => $subKey))); 
      } 
     } 
     /* return the list */ 
     return $indices; 
    } 
+0

你能分享你的疑問嗎?將有助於分析? – user10

+0

@ user10他分享他的quireies的例外,如果你看一半左右;這是https://jira.mongodb.org/browse/SERVER-3071將真正幫助 – Sammaye

回答

1

可惜我不能想到一個很好的解決方案,以這樣的動態性與指標然而,這JIRA https://jira.mongodb.org/browse/SERVER-3071將真正幫助你。

我建議你看那個JIRA票。

+0

感謝分享,我會密切關注。 – azz0r

+0

索引交集在這裏沒有幫助,因爲您至少仍需要每個字段的索引。 – Derick

+0

@Derick的確,但它比atm更有幫助,因爲mongodb只能爲每個查詢使用一個索引,並且可以在每個字段上放置索引並獲取索引使用情況,這與大多數SQL技術非常相似 – Sammaye

2

你應該知道的前期會什麼樣的查詢命中服務器。沒有這一點,你不能做任何優化,並可能遇到像你現在這樣的問題。

如果您說用戶可以按照您所擁有的9個字段中的任何一個進行排序,則需要爲每個字段創建一個索引。然而,你必須記住,有時它更有意義創建一個複合索引,爲防止該問題爲:

/post?updated=35234423&order_by=client_id 

只能通過設定的指標完成:MongoDB中

{ updated: 1, client_id: 1 } 

索引可以只有在索引中的所有左側字段都是查詢的一部分時才能使用。

所以:

  • find({ 'updated' : 1 });
  • find({ 'updated' : 1, 'client_id' : 1 });
  • find({ 'updated' : 1 }).sort({ 'client_id' : 1 });

但不適合:{ updated: 1, client_id: 1 }的作品最佳

  • find({ 'client_id' : 1 });
  • find({ 'client_id' : 1 }).sort({ 'updated' : 1 });

爲了減少數據量,並防止您的錯誤信息,您還可以額外添加一個limit()每個查詢。有8MB的結果,我懷疑你的用戶界面無論如何都能顯示出很多結果,所以使用limit()可能會有意義。

+0

謝謝。所以我可以根據共同的要求建立25個指數,但這會比較慢嗎? – azz0r

+0

插入/更新/刪除等時,更多索引需要更多時間。您可能需要重新考慮您的模式設計。 – Derick