[node.js] 프로덕션 코드의 몽구스 인덱싱

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

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

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

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

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



답변

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

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


답변

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

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

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

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

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

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

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

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

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


답변

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

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });


답변