MongoDB에서 레코드를 찾는 데 시간이 너무 오래 걸린다면 인덱스(Index)를 활용하는 것이 가장 효과적인 해결책입니다. 인덱스를 생성하면 컬렉션 전체를 스캔하는 대신 인덱스를 통해 원하는 데이터에 바로 접근할 수 있어 검색 성능이 크게 향상됩니다.
인덱스를 생성하는 기본 문법은 다음과 같습니다.
db.yourCollectionName.createIndex({yourFieldName:1});필드의 데이터 특성과 용도에 따라 숫자(오름차순·내림차순), 텍스트, 해시 등 다양한 유형의 인덱스를 만들 수 있습니다. 아래에서 세 가지 대표적인 방법을 예제와 함께 살펴보겠습니다.
첫 번째 방법: 오름차순 인덱스 생성
가장 일반적으로 사용되는 방법입니다. 필드 값에 1을 지정하면 해당 필드 기준의 오름차순 인덱스가 생성됩니다.
> db.takeLessTimeToSearchDemo.createIndex({"EmployeeName":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}실행 결과를 보면 createdCollectionAutomatically가 true로 표시된 것을 확인할 수 있는데, 이는 해당 컬렉션이 존재하지 않아 인덱스 생성 과정에서 자동으로 만들어졌다는 의미입니다. 또한 numIndexesAfter가 2로 증가한 것은 기본 _id 인덱스에 새로운 인덱스가 추가되었음을 나타냅니다.
두 번째 방법: 텍스트(Text) 인덱스 생성
문자열 필드에 대한 전체 텍스트 검색이 필요하다면 "text" 옵션을 사용해 텍스트 인덱스를 생성할 수 있습니다. 이 인덱스는 문자열 내용을 분석해 검색 조건에 맞는 문서를 빠르게 찾는 데 유용합니다.
> db.takeLessTimeToSearchDemo1.createIndex({"EmployeeName":"text"});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}세 번째 방법: 해시(Hashed) 인덱스 생성
"hashed" 옵션을 사용하면 필드 값의 해시값을 기반으로 하는 해시 인덱스가 생성됩니다. 이 인덱스는 해시 샤딩(Hashed Sharding) 환경에서 데이터를 고르게 분산시키는 데 특히 유용합니다.
> db.takeLessTimeToSearchDemo2.createIndex({"EmployeeName":"hashed"});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}정리 및 추가 팁
검색 속도가 느려졌다면 자주 조회 조건에 사용되는 필드에 위와 같은 방식으로 인덱스를 생성해 보세요. 참고로 현재 컬렉션에 설정된 인덱스 목록은 db.컬렉션이름.getIndexes() 명령으로 확인할 수 있으며, 쿼리가 인덱스를 실제로 사용하고 있는지는 explain() 메서드를 통해 검증할 수 있습니다. 다만 인덱스는 쓰기 작업(삽입·수정·삭제) 시 약간의 오버헤드를 발생시키므로, 필요한 필드에만 적절히 생성하는 것이 좋습니다.