2012-11-15 2 views
2

MongoDB에 대한 첫 번째 프로젝트를 수행하고 있으며 컬렉션의 암시 적 생성이 권장되는 방법입니다 (예 : db.myCollection.insert()가 처음으로 컬렉션을 생성 함) 삽입이 이루어짐)MongoDB 초기 배포 및 색인

나는이 방법으로 PHP를 사용하고 다른 컬렉션을 사용하고 있지만 문제는 그 컬렉션에 필요한 인덱스를 어디서 만들어야하는지 모른다는 것입니다. 컬렉션이 만들어지는 시점을 알 수 없으므로 순진한 접근 방식은 해당 컬렉션의 모든 작업 (매우 좋지는 않음) 전에 ensureIndex()를 호출하는 것입니다. 또는 데이터베이스에 연결될 때마다 색인이 존재하는지 확인하십시오 (생성되지 않은 모음에 색인을 작성하면 어떻게됩니까? 정의 되나요?)

모범 사례 권장 사항은 무엇입니까?

답변

2

확실하지 않음 앱에 ensureIndex를 넣지 않으려면 나는 보통 데이터베이스 쉘을 사용해야 할 것이라고 확신한다. 그런 다음로드 테스트 중 (또는 제품이 생산 속도가 느려지는 경우) 시력을 유지하고 쉘에서 다시 놓친 부분을 추가하십시오. ensureIndex ({a : 1}, {background : true})를 수행하여 백그라운드에서 색인을 작성할 수 있으므로 나중에 작성하는 것이 다른 db만큼 끔찍하지는 않습니다.

MongoDB에는 느린 작업을 찾을 수있는 좋은 프로파일 러가 있습니다. http://www.mongodb.org/display/DOCS/Database+Profiler.

10gen (MongoDB 's commercial counterpart)은 아직 사용하지는 않았지만 무료로 모니터링 서비스를 제공합니다 (http://www.10gen.com/mongodb-monitoring-service).

그러나 컬렉션을 만들기 전에 db.collection.ensureIndex()를 호출하면 컬렉션이 만들어지고 인덱스가 저장됩니다.

앱에서 확실히 원한다면 각 작업 전에 대신 두 번째 옵션 (DB 연결 직후에 색인을 보장)을 사용합니다. 내가했을 때 DB에 뭔가를 저장할 것이므로 부부가있을 때마다 매번 실행하지 마십시오. 여기에 PHP를 알고 있지만하지 마십시오 의사 코드 :

var test = db.systemChecks.findOne({indexes : true}) 
if (test == null) //item doesn't exist 
{ 
    //do all the ensureIndex() commands 
    db.systemChecks.insert({indexes : true}) 
} 

것은 그냥 당신이 당신이 더 많은 인덱스 나중에 인덱스를 통해 실행해야을 발견 한 경우, systemCheck 항목을 삭제하는 것을 기억

1

실제로는 ensureIndex()가 꼭 수행해야하는 작업입니다. 나는 당신이 그 모델 중 하나를 가지고 있다면, 특정 연결을 사용하는 각 Model의 생성자에서 그것을 할 것입니다. ensureIndex()는 인덱스가 아직 존재하지 않을 때 생성된다는 것을 보장합니다. 또는 데이터베이스 연결을 만들 때이를 수행 할 수 있습니다. 존재하지 않는 컬렉션에서 ensureIndex()를 실행하면 해당 컬렉션을 만들고 비어있는 색인을 만듭니다 (아직 문서가 없기 때문에).

향후

의 PHP 드라이버는 또한, ensureIndex()가 이미 동일한 요청에서 실행되었는지 여부를 캐시하는 것은 기본적에게 어떤 조합을하지 않습니다 : 그것은 가장 좋은 방법이지만, 나는 경향이 경우 https://jira.mongodb.org/browse/PHP-581