FAQ: Indexes
이 페이지의 내용
이 문서 에서는 MongoDB 인덱스와 관련된 몇 가지 일반적인 질문에 대해 설명합니다. 인덱스에 대한 자세한 내용은 인덱스를 참조하세요.
인덱스는 어떻게 만들 수 있나요?
컬렉션에 인덱스를 만들려면 db.collection.createIndex()
메서드를 사용합니다. 인덱스 생성은 관리 작업입니다. 일반적으로 애플리케이션은 db.collection.createIndex()
를 정기적으로 호출해서는 안 됩니다.
참고
인덱스 빌드는 성능에 영향을 줄 수 있습니다. 인덱스 빌드가 데이터베이스 성능에 어떤 영향을 미치나요?를 참조하세요. 관리자는 인덱스를 작성하기 전에 성능에 미치는 영향을 고려해야 합니다.
인덱스 빌드는 데이터베이스 성능에 어떤 영향을 미치나요?
채워진 컬렉션을 기반으로 MongoDB 인덱스를 빌드하려면 컬렉션에 대한 배타 읽기/쓰기 잠금이 필요합니다. 컬렉션에 대한 읽기 또는 쓰기 잠금(write lock)이 필요한 작업은 mongod
가 잠금을 해제할 때까지 기다려야 합니다.
기능 호환성 버전(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
문서가 포함되어 있습니다.
쓰기 작업은 인덱스에 어떤 영향을 주나요?
쓰기 작업에는 인덱스 업데이트가 필요할 수 있습니다.
쓰기 작업이 인덱싱된 필드를 수정하면 MongoDB는 수정된 필드를 키로 사용하는 모든 인덱스를 업데이트합니다.
따라서 애플리케이션이 쓰기 작업을 많이 하는 경우 인덱스가 성능에 영향을 미칠 수 있습니다.
무작위 데이터가 인덱스 성능에 어떤 영향을 미치나요?
작업에서 인덱싱된 필드에 대량의 임의 데이터(예시: 해시 인덱스)를 삽입하는 경우 삽입 성능이 저하될 수 있습니다. 무작위 데이터를 대량으로 삽입하면 무작위 인덱스 항목이 생성되어 인덱스 크기가 늘어납니다. 인덱스가 다른 인덱스 항목에 액세스하기 위해 각 무작위 삽입이 필요한 크기에 도달하면 삽입으로 인해 WiredTiger 캐시 제거 및 교체 비율이 높아집니다. 이 경우 인덱스가 더 이상 캐시에 완전히 저장되지 않고 디스크에서 업데이트되어 성능이 저하됩니다.
인덱싱된 필드에 무작위 데이터를 대량 삽입하는 성능을 개선하려면 다음 두 가지 방법을 사용할 수 있습니다.
인덱스를 제거한 다음 임의의 데이터를 삽입한 후 다시 생성합니다.
데이터를 인덱싱되지 않은 빈 collection에 삽입합니다.
대량 삽입 후 인덱스를 생성하면 메모리의 데이터가 정렬되고 모든 인덱스에 대해 정렬된 삽입이 수행됩니다.