簡體   English   中英

MongoDB的性能各不相同

[英]MongoDB performance varies

我有一個像這樣的mongo集合:


{
"A2_AboutMe": "",
"A2_Attributes": "|av|nv|",
"A2_Birthday": "",
"A2_DateCreated": "2010-11-25 22: 59: 00",
"A2_DateLast": "2011-11-18 12: 09: 36",
"A2_FK_A1_IDPerson": "0",
"A2_Firstname": "José Luis",
"A2_FirstnameC": "Jose Luis",
"A2_Gender": "m",
"A2_IDProfile": "1",
"A2_Keywords": "...|..",
"A2_Lastname": "test - test",
"A2_LastnameC": "_test test",
"A2_Locale": "",
"A2_Middlename": "",
"A2_Name": "José Luis test",
"A2_NameC": "Jose Luis test",
...
}

在此集合中具有A2_LastnameC和A2_FirstnameC 3.000.000文檔上的索引,8 GB數據存儲

在3-4秒內完成以下查詢(PHP)

$collection->find(array(«A2_FirstnameC» => new MongoRegex("/jose/i")))->sort(array(«A2_LastnameC» => -1))->limit(10)

但有時類似的查詢會在不到100毫秒的時間內完成。

每次我該怎么做才能獲得這種表現?

測試計算機為i7、8GB Ram(mongo使用7),Windows 7

索引不能用於不區分大小寫的正則表達式查詢,也不能用於無根的正則表達式(不是以“ ^ ”開頭的正則表達式)。 由於您已經將A2_Firstname字段反規范化為A2_FirstnameC ,因此您還可以將該字段進行大小寫規范化(即全部小寫或全部大寫),並且避免使用不區分大小寫的正則表達式; 但是,即使在這種情況下,如果您不使用根植的正則表達式,仍將對集合進行完整掃描。 在這種情況下,您是否可以負擔得起使用費用取決於您的確切使用情況。

首先,索引不會用於非前綴,不區分大小寫的正則表達式。 但是在上面的查詢中,索引可以用於按A2_LastnameC字段進行排序,因此速度很快。 現在,擁有排序后的數據,MongoDB將需要獲取A2_FirstnameC值並將其與正則表達式匹配(當准備好10個匹配項時停止)(這也相對較快,因為它將使用索引來檢索數據,而不是從磁盤讀取整個文檔)。 根據數據順序,它可能碰巧匹配前10個文檔-這是最好的情況,而且速度非常快,最壞的情況是將在必須掃描所有先前索引條目的最后10個文檔中發生匹配。

如何加快速度? 可以使用可以使用索引的查詢,例如: «A2_FirstnameC» => new MongoRegex("/^jose/") 或者,您必須使用某種全文本搜索。 一種簡單的方法是將字段(在您的情況下為A2_Firstname )拆分為單詞,對其進行規范化(轉換為小寫,替換重音符號)並存儲為數組。 現在,將使用數組字段的索引進行快速搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM