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가 데이터 검색을위한 최선의 도구가 아니라고 동의합니다. 나는 우리가 MySQL을 다른 프로젝트에서 많이 사용하기 때문에 MySQL이 Postgresql과 동등하게 빠를 것이라고 가정한다. 2) "findable_registering_organization"필드를 토큰화할 생각이 맘에 든다. 그러나, 내가 틀리지 않다면이 접근법에서 와일드 카드의 속성을 잃어 버리게 될 것입니다.나는 accaptable tradeoff (3)로 볼 수 있습니다. luchene과 같은 FTS를 사용하여 더 나은 와일드 카드 검색을 할 수 있습니다. – nir
Mongo $ OR 쿼리에 대한 한 가지 더. 나는 여러 clasuses와 함께 $ OR 쿼리 만 실행했습니다. 문서에 따르면 쿼리는 병렬로 실행되어야하지만 병렬로 실행되는 것은 아닙니다. mongo 서버에 16 코어가 있지만 활용할 수있는 코어는 하나뿐입니다! – nir