프로덕션 코드의 몽구스 인덱싱


124

몽구스의 당 문서 에 대한 MongooseJSMongoDB/ Node.js:

애플리케이션이 시작되면 Mongoose는 ensureIndex스키마에 정의 된 각 인덱스를 자동으로 호출 합니다. 개발에는 좋지만 인덱스 생성이 성능에 상당한 영향을 미칠 수 있으므로 프로덕션에서는이 동작을 비활성화하는 것이 좋습니다. autoIndex스키마 옵션을 false 로 설정하여 동작을 비활성화하십시오 .

이것은 Mongo가 애플리케이션 시작시 모든 인덱스를 통해 이동하고 이탈하도록 지시하는 것으로부터 Mongoose를 최적화하기 위해 배포하기 전에 mongoose에서 자동 인덱싱을 제거하도록 지시하는 것으로 보입니다.

프로덕션 코드에서 인덱싱을 처리하는 적절한 방법은 무엇입니까? 외부 스크립트가 색인을 생성해야할까요? 아니면 ensureIndexDB 쓰기가 발생할 때마다 인덱스를 계속하기 때문에 단일 애플리케이션이 컬렉션에 대한 유일한 리더 / 라이터라면 불필요할까요?

편집 : 보충하기 위해 MongoDB는 인덱싱을 수행 하는 방법 에 대한 좋은 문서 를 제공 하지만 명시 적 인덱싱 지시문을 수행해야하는 이유 또는 시기는 아닙니다 . 필자는 기존 인덱스가있는 컬렉션에 대해 작성기 응용 프로그램에서 인덱스를 자동으로 최신 상태로 유지해야하는 것으로 보이며 이는 실제로 일회성 작업 (새 인덱스가 적용될 때 수행됨)에 가깝습니다.이 경우 Mongoose 는 정상적인 서버 재시작 상태에서는 작동하지 않습니다.ensureIndexautoIndex

답변:


135

Mongoose 문서 autoIndex가 프로덕션에서 비활성화 를 권장하는 이유를 이해하지 못했습니다 . 인덱스가 추가되면 후속 ensureIndex호출은 단순히 인덱스가 이미 존재하는 것을 확인한 다음 반환합니다. 따라서 인덱스를 처음 만들 때만 성능에 영향을 미치며, 그 당시에는 컬렉션이 비어있는 경우가 많으므로 어쨌든 인덱스를 빠르게 만들 수 있습니다.

내 제안은 autoIndex문제를 일으키는 특정 상황이 아니라면 활성화 상태로 두는 것입니다. 수백만 개의 문서가있는 기존 컬렉션에 새 색인을 추가하고 생성시기를 더 세부적으로 제어하려는 경우와 같습니다.


10
추가 할 질문이 있습니다 ... 거짓으로 설정하면 어떻게됩니까? 데이터를 삽입 할 때 인덱스가 생성되거나 명시 적으로 생성해야합니까? 초심자 질문이라면 미안하지만 답변 해주시면 정말 도움이 될 것 같습니다.
Saransh Mohapatra

5
@SaranshMohapatra autoIndexfalse이면 모델에서 ensureIndexes 를 호출 하여 인덱스를 만들어야합니다.
JohnnyHK 2013-06-23

모델을 정의 할 때마다 또는 한 번만 호출해야합니까?
Saransh Mohapatra 2013

모델을 정의 (컴파일) 할 때 @SaranshMohapatra. 앱을 처음 시작할 때 그렇게합니다. 이제 어려운 생각은 스키마가 변경 될 경우 모든 인덱스를 삭제하고 다시 생성하기로 결정하는 것입니다.
Moss

3
@JohnnyHK 거의 2016 년이 된 지금도 답변에 동의하십니까?
Alexander Mills

41

받아 들인 대답에 동의하지만 MongoDB 매뉴얼에 따르면 이것은 프로덕션 서버에 인덱스를 추가하는 데 권장되는 방법이 아니라는 점에 주목할 가치가 있습니다 .

애플리케이션에 ensureIndex () 작업이 포함되어 있고 다른 운영 문제에 대한 색인이없는 경우 색인을 작성하면 데이터베이스 성능에 심각한 영향을 미칠 수 있습니다.

성능 문제를 방지하려면 응용 프로그램이 시작시 getIndexes () 메서드 또는 드라이버에 해당하는 메서드를 사용하여 인덱스를 확인하고 적절한 인덱스가 없으면 종료해야합니다. 지정된 유지 관리 기간 동안 항상 별도의 애플리케이션 코드를 사용하여 프로덕션 인스턴스에서 인덱스를 빌드하십시오.

물론 애플리케이션의 구조 및 배포 방식에 따라 다릅니다. 예를 들어 Heroku에 배포하고 Heroku의 사전 부팅 기능을 사용하지 않는 경우 애플리케이션이 시작 중에 요청을 전혀 제공하지 않을 가능성이 있으므로 해당 시점에 인덱스를 생성하는 것이 안전 할 수 있습니다.

이 외에도 수락 된 답변에서 :

따라서 인덱스를 처음 만들 때만 성능에 영향을 미치며, 그 당시에는 컬렉션이 비어있는 경우가 많으므로 어쨌든 인덱스를 빠르게 만들 수 있습니다.

데이터 모델과 쿼리를 처음부터 확인했다면 괜찮습니다. 그러나 인덱스가없는 속성에 대한 새 DB 쿼리를 사용하여 앱에 새로운 기능을 추가하는 경우 기존 문서가 많이 포함 된 컬렉션에 인덱스를 추가하는 경우가 많습니다.

지금은 인덱스 추가에 대해주의해야 할 때이며 그렇게함으로써 성능에 미치는 영향을주의 깊게 고려해야합니다. 예를 들어 백그라운드에서 색인을 만들있습니다 .

db.ensureIndex({ name: 1 }, { background: true });

3
좋습니다. 각 컬렉션에 대해 모든 ensureIndex 콜백이 실행될 때까지 서버를 시작하지 마십시오.
Alexander Mills

@AlexMills 어떻게 그것을 보장합니까?
lonelymo

async.each (Object.keys (모델), 기능 (키, CB) {모델 [키] .ensureIndexes (CB)}, CB)
알렉산더 밀스

각 몽구스 모델에서 ensureIndexes를 호출하고 모두 완료 될 때까지 기다린 다음 서버를 시작하십시오. 나는 또한뿐만 아니라 DB를 연결하여 서버를 시작하기 전에 일이 기다리고 추천
알렉산더 밀스에게

2
ensureIndex이상 없습니다. 이 createIndex대신. 내가 맞아?
jack blank

1

이 블록 코드를 사용하여 생산 모드를 처리하십시오.

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.