2014-07-15 70 views
0

我有一個MySQL作爲主數據庫和mongodb作爲輔助數據庫。 我在生產上運行查詢並運行超過5秒鐘。我的mongo查詢讀取運行超過5000毫秒

這裏是我的查詢時,我與運行解釋

{ 
"cursor" : "BtreeCursor host_1_type_1 multi", 
"isMultiKey" : false, 
"n" : 1, 
"nscannedObjects" : 1, 
"nscanned" : 313566, 
"nscannedObjectsAllPlans" : 313553, 
"nscannedAllPlans" : 627118, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 14, 
"nChunkSkips" : 0, 
"millis" : 6555, 
"indexBounds" : { 
    "host" : [ 
     [ 
      "", 
      { 

      } 
     ], 
     [ 
      /shannisideup/i, 
      /shannisideup/i 
     ] 
    ], 
    "type" : [ 
     [ 
      "ambassador-profile", 
      "ambassador-profile" 
     ] 
    ] 
}, 
"server" : "mongoserver:27017" 
} 

我添加一個索引

[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "db.visitor", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "host" : 1, 
     "type" : 1 
    }, 
    "ns" : "db.visitor", 
    "name" : "host_1_type_1" 
} 
] 

,但我仍然不知道爲什麼它這麼慢時運行的查詢

db.visitor.find({ host:/shannisideup/i, type:"ambassador-profile" }).limit(1) 

僅供參考,我爲我的應用程序和AWS雲中的我的mongodb服務器運行了不同的服務器。 對於運行EC2 m3.medium的mongodb,我試着提高了mongodb網站建議的openfile限制。我的mongodb運行在通過/ dev/sdf安裝的單獨的100GB磁盤上。 我執行MongoDB版本2.4.5 當我的MongoDB的運行時,CPU負荷幾乎都是100%

我的彩信統計爲opcounter是:

  • 命令:19.11

  • 查詢:13.79

  • 更新:0.03

  • 刪除:0.00001

  • getmore:0

  • 插入:0.03

我最高的頁面錯誤是0.02

我能做些什麼,以我的MongoDB的優化,以小於1秒?

+0

多大主機領域?最有可能的正則表達式必須瘋狂,還應該注意的是,您的索引的當前順序對於此查詢不是最優的。你應該把精確匹配的領域,然後你的部分匹配字段 – Sammaye

+0

嗨Sammaye,我不知道多久/大是我的主人領域,但我使用它的字符串,我的主機是爲了保存網站的網址。關於索引,所以你會建議我索引主機,然後單獨鍵入? –

+1

Nah我會做一個'{type:1,host:1}'的複合索引,看看是否有幫助,因爲當然有正則表達式首先意味着你必須掃描整個索引 – Sammaye

回答

0

雖然我想澄清大小寫不敏感的正則表達式搜索(「host:/ shannisideup/i」)不能使用索引,但我會走過一些應該幫助的東西,你可以使用這個數據模型和搜索。您可以看到它正在掃描大量對象(「nscanned」:313566),以返回1個文檔。

可以做的事:

  • 用更快的CPU升級您的實例 - 100%的CPU負載時 這種情況下不區分大小寫搜索是一個明確的指標,有時 你的數據庫是CPU限制。更快的CPU將有所幫助。更多內存 (當你移動到 更快的cpu時,它通常與Amazon EC2實例一起提供)也不會造成任何影響。與更快的磁盤(SSD)一樣。

  • 小寫將其存儲在MongoDB中之前,你的主機場 - 如果你 店都在較低的情況下,您的主機,然後小寫搜索 字符串搜索之前,你可以擺脫不區分大小寫的標誌 爲正則表達式。如果你可以結合你的 正則表達式中的前綴運算符,你將能夠使用索引,這將有所幫助。

  • 考慮爲主機查詢使用專用文本搜索產品(如Solr或 Elasticsearch)。 MongoDB在文本 中的搜索能力有限,特別是在通配符搜索方面。 您可能會發現像Elasticsearch或Solr這樣的東西可能會提供更好的性能 。

,你可能會發現有用的幾個環節:

http://docs.mongodb.org/manual/reference/operator/query/regex/

http://selectnull.leongkui.me/2014/02/02/mongodb-elasticsearch-perfect-nosql-duo/

+0

哦,我明白了。這就是它掃描完整文檔的原因。 感謝您的答案,我會優化mongodb第一,如果它仍然不能達到我預期的性能,我會研究索爾 –

+0

@IhsanKurniawan實際上正則表達式可以使用索引,它只需要做一個完整的索引掃描。更合適的詞是它不能有效地使用索引 – Sammaye

相關問題