2014-02-27 3 views
0

이것은 mongodb에서 간단한 검색에 대한 설명으로, 데이터를 검색하는 데 2.4 초 이상 소요됩니다. 인덱스 (검색 매개 변수)를 추가하는 데는 5 초 이상 걸립니다.mongo 간단한 검색 쿼리의 성능을 향상시키는 방법

쿼리

db.CX_EMPLOYEES.find({ "$or" : [{ "AML_FULLNAME" : /RAJ/ }, 
{ "AML_FULLALIAS" : /RAJ/ }] }) 

당신이 정규 표현식을 사용하기 때문에이 검색 PARAMS에 인덱스를 추가 할 어떤 이유가 없습니다

{ 
     "cursor" : "BasicCursor", 
     "isMultiKey" : false, 
     "n" : 79, 
     "nscannedObjects" : 504570, 
     "nscanned" : 504570, 
     "nscannedObjectsAllPlans" : 504570, 
     "nscannedAllPlans" : 504570, 
     "scanAndOrder" : false, 
     "indexOnly" : false, 
     "nYields" : 0, 
     "nChunkSkips" : 0, 
     "millis" : 2423, 
     "indexBounds" : {}, 
     "server" : "SERVER:27017" 
    } 

답변

0

을 설명한다. regExp가 처음에 앵커를 가지고있을 때만 인덱스가 regExp를 사용하여 향상 될 수 있습니다. documentation 가입일

db.CX_EMPLOYEES.find({ "$or" : [{ "AML_FULLNAME" : /^RAJ/ }, { "AML_FULLALIAS" : /^RAJ/ }] }) 

: 정규 표현식은 스트링의 시작에 대한 앵커 (즉 ^)를 갖고, 대소 문자 매치 때

$ 정규식에만 효율적 인덱스를 사용할 수있다. 또한/^ a /, /^a.*/ 및 /^a.*$/는 동일한 문자열과 일치하지만 성능 특성이 다릅니다. 이러한 모든 표현식은 적절한 색인이 존재하는 경우 색인을 사용합니다. 그러나 /^a.*/ 및 /^a.*$/은 더 느립니다./^ a/접두어와 일치 한 후에 스캔을 멈출 수 있습니다.

0

할 수있는 일이 많지 않습니다. 당신은 백만 가지 요소의 절반을 가지고 있으며 그들 모두에 대해 전체 스캔을하고 있습니다. 시간이 걸리는 것은 놀랄 일이 아닙니다. 또한 검색은 정규 표현식을 기반으로하며 문자열의 어느 위치 에나있을 수 있습니다. 그래서 인덱스는이 경우 당신을 도울 수 없습니다.

검색이 단어를 기반으로하는 경우 문자열에서 배열을 만들 수 있습니다. 예를 들어 문자열 'Salvador Domingo Dali'['Salvador', 'Domingo', 'Dali']으로 변환됩니다. 이 배열에 인덱스를 추가하고 'Dali'을 찾으려고하면 검색에서이 인덱스를 활용합니다.

P. 데이터베이스와 색인은 총알이 아닙니다. 때로는 많은 데이터를 처리 할 수있는 더 나은 논리가 필요합니다.

+0

나는 당신이 그 배열에 인덱스를 추가하고 말했던 것처럼 이름을 저장하기 위해 먼저 array를 사용했지만, 매우 비싸다는 것을 발견했다. 이 검색은 3-10 분이 걸렸으므로 시간을 줄이는 단일 열로 변경했으나 여전히 내 테스트 데이터입니다. 생산은 더 많은 데이터를 가질 것입니다. pls는 몇 가지 솔루션을 도와줍니다 – deepu

+0

배열 솔루션과 관련 예제를 문서에서 설명을 보여줄 수 있습니까? –

1

MongoDb의 2.6 버전을 예약하면 full text search 기능입니다. 사용 가능한 경우 현재 빌드에서 개발 미리보기로 사용할 수 있습니다.

쿼리의 특성상 MongoDb 만 사용하면 효과적 일 수 있습니다. 입력 한 정규 표현식에 따라 "문자열 포함"검색을 수행하려고 할 때 컬렉션의 크기를 고려할 때 여러 필드에서 문자열을 일치시키는 검색을 수행하면 성능이 저하됩니다. 개념적으로 단순한 쿼리이지만 효율적인 쿼리로의 변환은 매우 어렵습니다. Mongo는 모든 문서를 검색하여 일치해야합니다. Mongo가 문서를 여전히 스캔해야하므로 단어를 분리하면 도움이되지 않습니다.

"문자열 포함"대신 "문자열 시작"으로 바뀌는 정규식을 고정 할 수있는 경우 모든 문자 대/소문자가 무시되도록 문자열을 정규화하면 성능이 적절해야합니다. 일치하는 것은 여전히 ​​정확한 것입니다. 예를 들어 aá이 아니므로 특별히 처리해야합니다.

이러한 유형의 쿼리에 대한 Mongo의 지원은 실제로 프로덕션 용도로만 제한됩니다. 전체 텍스트 검색 기능이 적합하지 않을 수도 있습니다.이 쿼리가 중요한 경우 대체 검색 메커니즘을 고려해 보시기 바랍니다. 예를 들어 Elastic Search과 같이 보일 수도 있습니다.

+0

mongodb에서 전체 텍스트 검색 기능을 사용하고 있습니다. 신뢰할 수있는 방법이나 해결책은 무엇입니까? 나는 그것을 프로덕션에서 사용하는 것은 권장하지 않습니다. – deepu

+0

2.6 현재 릴리스 후보입니다. 비 몽고 솔루션을 고려하고 싶을 것입니다. – WiredPrairie

관련 문제