2012-04-09 2 views
4

색인이있는 "이름"필드가있는 모음에 150 만 개의 문서가 있습니다. db.things.find({name: /^foo/i})과 같은 쿼리는 약 5 초가 걸리고 매우 느립니다. 동일한 레코드를 가진 비슷한 MySQL 테이블은 SELECT * FROM things WHERE name LIKE 'foo%'을 10ms 미만으로 수행합니다.MongoDB에서 느린 regexp 쿼리

db.things.find({name: /^foo/i}).limit(10).explain() 
{ 
    "cursor" : "BtreeCursor name_1 multi", 
    "nscanned" : 325730, 
    "nscannedObjects" : 10, 
    "n" : 10, 
    "millis" : 4758, 
    "nYields" : 89, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "name" : [ 
      [ 
       "", 
       { 

       } 
      ], 
      [ 
       /^foo/i, 
       /^foo/i 
      ] 
     ] 
    } 
} 

그래서 정규 표현식 쿼리 몽고에서 이 느리거나 내가 잘못을하고있는 중이 야 :

몽고의의 설명?

답변

4

대문자와 소문자를 구별하지 않는 정규 표현식은 색인을 효율적으로 이용할 수 없기 때문에 속도가 느립니다. 검색 용 필드 만 사용하는 경우 텍스트를 모두 소문자 형식으로 저장하고 대/소문자를 구분하는 정규식을 사용하여 검색하는 것이 좋습니다.