2013-08-19 7 views
0

java 드라이버에서 mongo 클러스터에 대해 와일드 카드/정규식 기반 쿼리를 실행하려고합니다. 몽고 복제 세트의 구성 : 3 멤버 복제 (16) CPU (하이퍼 스레딩), 24G RAM 리눅스 x86_64의 컬렉션의 크기 : 6M 행, 7 세대 데이터Mongodb 쿼리 최적화 - 병렬 쿼리 실행 중

클라이언트는 최신 몽고 - 자바 드라이버와 로컬 호스트 (맥 OSX 10.8)입니다

readpref = primaryPreffered

{ "$and" : [{ "$or" : [ { "country" : "united states"}]} , { "$or" : [ { "registering_organization" : { "$regex" : "^.*itt.*hartford.*$"}} , { "registering_organization" : { "$regex" : "^.*met.*life.*$"}} , { "registering_organization" : { "$regex" : "^.*cardinal.*health.*$"}}]}]} 

와 자바 드라이버를 사용

쿼리 나는 "국가"와 "registering_organization"모두 정기적으로 인덱스를 가지고있다. 그러나 몽고 워드 프로세서 당 하나의 쿼리는 단 하나의 인덱스만을 사용할 수 있으며 위 쿼리의 explain()에서도 볼 수 있습니다.

내 질문에 위의 쿼리에서 더 나은 성능을 얻을 수있는 가장 좋은 대안은 무엇입니까. '및'작업을 중단하고 메모리 교차로에서해야합니까? 더 나아가 나는 쿼리에서 'Not'연산도 갖게 될 것이다.

내 응용 프로그램이 미래에보고/분석으로 전환 될 수 있다고 생각하지만 그 내용이 잘못되거나 적절하게 설계되지 않을 것으로 생각됩니다.

답변

1

이 쿼리에는 많은 문제가 있습니다.

중첩 된 정규식 조건은 MongoDB에서 절대로 더 빨라질 수 없습니다. MongoDB는 "데이터 발견"을위한 최선의 도구는 아닙니다 (예 : 알려지지 않은 정보를 밝히기위한 임시, 다중 조건부 쿼리). MongoDB는 생성하는 메트릭스를 알면 빠르게 타격을 입습니다. 그러나 데이터 검색에는 적합하지 않습니다. 이 실행중인 공통 질의 인 경우

, 그럼 나는 "united_states_or_health_care"이라는 속성을 생성하고, 생성 날짜의 타임 스탬프 값을 설정합니다. 이 방법을 사용하면 논리를 쿼리에서 문서 스키마로 옮길 수 있습니다. 이것은 MongoDB로 스케일링을 생각하는 일반적인 방법 중 하나입니다. 당신은 데이터 검색을 수행하는 경우

, 당신은 몇 가지 다른 옵션이 있습니다

  • 응용 프로그램 보조 MongoDB를에 다른 쿼리
  • 실행 쿼리의 결과를 연결하여, 느린 성능을 동의합니다를
  • mosql을 사용하여 데이터를 Postgresql로 파이프하십시오. Postgres는 이러한 데이터 검색 쿼리를 훨씬 빠르게 실행합니다.

또 다른 팁 :

귀하의 정규 표현식에이 방법으로 고정되지는 빨라야합니다. "finding_registering_organization"필터를 통해 "registration_organization"속성을 실행하는 것이 가장 좋습니다. 필터는 조직을 쿼리 할 수있는 이름 하위 집합으로 분해하여 정규 표현식을 사용합니다. 업종 조회로 들어오는 이름을 필터링 할 수있는 경우 +2 점.

+0

1) MongoDB가 데이터 검색을위한 최선의 도구가 아니라고 동의합니다. 나는 우리가 MySQL을 다른 프로젝트에서 많이 사용하기 때문에 MySQL이 Postgresql과 동등하게 빠를 것이라고 가정한다. 2) "findable_registering_organization"필드를 토큰화할 생각이 맘에 든다. 그러나, 내가 틀리지 않다면이 접근법에서 와일드 카드의 속성을 잃어 버리게 될 것입니다.나는 accaptable tradeoff (3)로 볼 수 있습니다. luchene과 같은 FTS를 사용하여 더 나은 와일드 카드 검색을 할 수 있습니다. – nir

+0

Mongo $ OR 쿼리에 대한 한 가지 더. 나는 여러 clasuses와 함께 $ OR 쿼리 만 실행했습니다. 문서에 따르면 쿼리는 병렬로 실행되어야하지만 병렬로 실행되는 것은 아닙니다. mongo 서버에 16 코어가 있지만 활용할 수있는 코어는 하나뿐입니다! – nir