문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

FAQ: 색인

이 페이지의 내용

  • 인덱스는 어떻게 만들 수 있나요?
  • 인덱스 빌드는 데이터베이스 성능에 어떤 영향을 미치나요?
  • 인덱스 빌드 진행 상황을 어떻게 모니터링하나요?
  • 인덱스 빌드를 어떻게 종료하나요?
  • 컬렉션에 어떤 인덱스가 있는지 어떻게 확인하나요?
  • 쿼리가 인덱스를 사용하는지 어떻게 확인하나요?
  • 인덱싱할 필드를 어떻게 결정하나요?
  • 인덱스의 크기는 어떻게 확인하나요?
  • 쓰기 작업은 인덱스에 어떤 영향을 주나요?
  • 무작위 데이터가 인덱스 성능에 어떤 영향을 미치나요?

이 문서에서는 MongoDB 인덱스와 관련된 몇 가지 일반적인 질문에 대해 설명합니다. 인덱스에 대한 자세한 내용은 인덱스를 참조하세요.

컬렉션에 인덱스를 만들려면 db.collection.createIndex() 메서드를 사용합니다. 인덱스 생성은 관리 작업입니다. 일반적으로 애플리케이션은 db.collection.createIndex()를 정기적으로 호출해서는 안 됩니다.

참고

인덱스 빌드는 성능에 영향을 줄 수 있습니다. 참조인덱스 빌드는 데이터베이스 성능에 어떤 영향을 미치나요?. 관리자는 인덱스를 작성하기 전에 성능에 미치는 영향을 고려해야 합니다.

채워진 컬렉션을 기반으로 MongoDB 인덱스를 빌드하려면 컬렉션에 대한 배타 읽기/쓰기 잠금이 필요합니다. 컬렉션에 대한 읽기 또는 쓰기 잠금이 필요한 작업은 mongod가 잠금을 해제할 때까지 기다려야 합니다.

버전 4.2에서 변경되었습니다.

  • 기능 호환성 버전(fcv) "4.2"의 경우, MongoDB는 인덱스 빌드의 시작과 끝에서만 배타 락을 유지하는 최적화된 빌드 프로세스를 사용합니다. 빌드 프로세스의 나머지 부분은 읽기 및 쓰기 작업과 교차하여 진행됩니다.

  • 기능 호환성 버전 (fcv) "4.0"의 경우 기본 포그라운드 인덱스 빌드 프로세스는 전체 인덱스 빌드에 대한 배타 락을 유지합니다. background 인덱스 빌드는 빌드 프로세스 중에 배타 락을 사용하지 않습니다.

인덱스 빌드 프로세스에 대한 자세한 내용은 채워진 컬렉션의 인덱스 빌드를참조하세요.

복제본 세트에 대한 인덱스 빌드에는 특정 성능 고려 사항과 위험이 있습니다. 자세한 내용은 복제된 환경에서의 인덱스 빌드를 참조하세요. 인덱스 빌드가 샤드 복제본 세트를 포함한 복제본 세트에 미치는 영향을 최소화하려면 복제본 세트의 롤링 인덱스 빌드에 설명된 대로 롤링 인덱스 빌드 절차를 사용합니다.

현재 실행 중인 인덱스 생성 작업에 대한 정보를 반환하려면 활성 인덱싱 작업을 참조하세요.

진행 중인 인덱스 빌드를 종료하려면 또는 해당 db.collection.dropIndex() 또는 해당 셸 헬퍼 dropIndex() 또는 dropIndexes를 사용합니다. db.killOp()를 사용하여 복제본 세트 또는 샤드 클러스터에서 진행 중인 인덱스 빌드를 종료하지 마세요.

복제본 세트의 세컨더리 멤버에 대해 복제된 인덱스 빌드를 종료할 수 없습니다. 먼저 프라이머리에서 인덱스를 삭제해야 합니다. 프라이머리는 인덱스 빌드를 중지하고 관련 abortIndexBuild oplog 항목을 생성합니다. abortIndexBuild oplog 항목을 복제하는 세컨더리는 진행 중인 인덱스 빌드를 중지하고 빌드 작업을 삭제합니다.

자세한 내용은 진행 중인 인덱스 빌드 중지를 참조하세요.

컬렉션의 인덱스를 나열하려면 db.collection.getIndexes() 메서드를 사용합니다.

MongoDB가 쿼리를 처리하는 방법을 검사하려면 explain() 메서드를 사용합니다.

선택성, 여러 쿼리 형태 지원, 인덱스 크기 등 여러 가지 요인에 따라 인덱싱할 필드가 결정됩니다. 자세한 내용은 인덱스에 대한 작업 고려 사항인덱싱 전략을 참조하세요.

db.collection.stats()에는 컬렉션의 각 인덱스에 대한 크기 정보를 제공하는 indexSizes 문서가 포함되어 있습니다.

크기에 따라 인덱스가 RAM에 맞지 않을 수 있습니다. 서버에 인덱스와 나머지 작업 세트 모두에 사용할 수 있는 충분한 RAM이 있는 경우 인덱스가 RAM에 맞습니다. 인덱스가 너무 커서 RAM에 맞지 않는 경우, MongoDB가 디스크에서 인덱스를 읽어야 하며, RAM에서 읽는 것보다 훨씬 느립니다.

경우에 따라 인덱스가 RAM에 완전히 맞ㅇ을 필요가 없는 경우도 있습니다. 자세한 내용은 RAM에 최근 값만 저장하는 인덱스를 참조하세요.

쓰기 작업에는 인덱스 업데이트가 필요할 수 있습니다.

  • 쓰기 작업이 인덱싱된 필드를 수정하면 MongoDB는 수정된 필드를 키로 사용하는 모든 인덱스를 업데이트합니다.

따라서 애플리케이션이 쓰기 작업을 많이 하는 경우 인덱스가 성능에 영향을 미칠 수 있습니다.

작업에서 인덱싱된 필드에 대량의 임의 데이터(예: 해시 인덱스)를 삽입하는 경우 삽입 성능이 저하될 수 있습니다. 무작위 데이터를 대량으로 삽입하면 무작위 인덱스 항목이 생성되어 인덱스 크기가 늘어납니다. 인덱스가 다른 인덱스 항목에 액세스하기 위해 각 무작위 삽입이 필요한 크기에 도달하면 삽입으로 인해 WiredTiger 캐시 제거 및 교체 비율이 높아집니다. 이 경우 인덱스가 더 이상 캐시에 완전히 저장되지 않고 디스크에서 업데이트되어 성능이 저하됩니다.

인덱싱된 필드에 무작위 데이터를 대량 삽입하는 성능을 개선하려면 다음 두 가지 방법을 사용할 수 있습니다.

  • 인덱스를 삭제한 다음 임의의 데이터를 삽입한 후 다시 생성합니다.

  • 데이터를 인덱싱되지 않은 빈 collection에 삽입합니다.

대량 삽입 후 인덱스를 생성하면 메모리의 데이터가 정렬되고 모든 인덱스에 대해 정렬된 삽입이 수행됩니다.

← FAQ: MongoDB 기본 사항