我目前開發的系統,使用MongoDB 2.4.4MongoDB發現緩慢與正則表達式
我有一個用戶的集合。
有一個組合索引:{ "LASTNAME" : 1 , "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1}
我也試圖與單一的指標,沒有性能提升
該系統包含400.000測試記錄。
查詢(從org.springframework.data.mongodb.core.query.Query爪哇調試):16ms.That內
{ "LASTNAME" : { "$regex" : "^Schm"}},
Fields: { "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1 ,"LASTNAME" : 1},
Sort: { "LASTNAME" : 1 , "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1}
執行是奇妙。
該查詢未在MongoDB控制檯中顯示(不在此處發佈調試信息)。
但是,我喜歡搜索不僅從頭開始,它也應該是不區分大小寫的。
查詢:內897ms
{ "LASTNAME" : { "$regex" : "^Schm" , "$options" : "i"}},
Fields: { "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1 , "LASTNAME" : 1},
Sort: { "LASTNAME" : 1 , "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1}
執行。這是不可接受的緩慢。
蒙戈控制檯顯示此:
query: { query: { LASTNAME: /^Schm/i },
orderby: { LASTNAME: 1, FIRSTNAME: 1, EMAIL: 1, CITY:1, STATUS: 1 }
} cursorid:1252405545564528 ntoreturn:25 ntoskip:0 nscanned:297651
keyUpdates:0 numYields: 1 locks(micros) r:1391715 nreturned:25 reslen:4422 897ms
正如人們所看到。這不是指向索引問題的scanAndOrder問題。
然後,我試圖解決它的下一個方法是什麼適合大多數情況下(插入從用戶,小寫和大寫),但也是較慢。我的期望是,它執行三次與第一次查詢一樣長。
查詢:1300ms內
{ "$or" : [ { "LASTNAME" : { "$regex" : "^Schm"}} , { "LASTNAME" : { "$regex" : "^schm"}} , { "LASTNAME" : { "$regex" : "^SCHM"}}]},
Fields: { "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1 , "LASTNAME" : 1},
Sort: { "LASTNAME" : 1 , "FIRSTNAME" : 1 , "EMAIL" : 1 , "CITY" : 1 , "STATUS" : 1}
執行。沒什麼好說的。
MongoDB的控制檯:
query: { query: { $or: [ { LASTNAME: /^Schm/ }, { LASTNAME: /^schm/ }, { LASTNAME: /^SCHM/ } ] },
orderby: { LASTNAME: 1, FIRSTNAME: 1, EMAIL: 1, CITY: 1, STATUS: 1 }
} cursorid:43560166842085 ntoreturn:25 ntoskip:0 nscanned:297651
keyUpdates:0 numYields: 1 locks(micros) r:1531168 nreturned:25 reslen:4422 1300ms
所以,我怎麼可以搜索不區分大小寫,近有第一搜索的速度? 最大150ms!
作爲一個方面說明,我已經刪除了Java標記,因爲這個問題只與Mongo相關,而不是Java –
您可以請您爲'$或'查詢發佈'explain()' –
我不知道如何,使用Spring MongoTemplate。目前正在考慮切換到mongo-java-driver ... – Nabor