Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 대용량 텍스트 필드를 인덱싱해 쿼리 속도 높이는 방법

MongoDB에서 대용량 텍스트 필드의 검색 성능을 개선하려면 ensureIndex() 메서드로 인덱스를 생성하고, 텍스트 검색 시 $regex 연산자를 함께 활용하는 것이 효과적입니다. 특히 정규식 패턴이 문서 시작 부분(^)을 기준으로 작성되면 MongoDB가 기존 인덱스를 그대로 활용할 수 있어 쿼리 속도가 크게 향상됩니다.

1. 컬렉션 생성 및 인덱스 설정

먼저 demo46 컬렉션을 자동으로 생성하면서 Name 필드에 오름차순 인덱스를 만들어 보겠습니다.

> db.demo46.ensureIndex({"Name":1});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

실행 결과 numIndexesAfter가 2로 증가한 것을 확인할 수 있습니다. 이는 _id 기본 인덱스에 더해 Name 필드 인덱스가 새로 추가되었음을 의미합니다.

2. 샘플 문서 삽입

테스트를 위해 세 개의 문서를 컬렉션에 삽입합니다.

> db.demo46.insertOne({"Name":"John Smith"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e267004cfb11e5c34d898ed")
}
> db.demo46.insertOne({"Name":"John Doe"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e267009cfb11e5c34d898ee")
}
> db.demo46.insertOne({"Name":"Chris Brown"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e267011cfb11e5c34d898ef")
}

3. 저장된 문서 조회하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.demo46.find();

위 명령은 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e267004cfb11e5c34d898ed"), "Name" : "John Smith" }
{ "_id" : ObjectId("5e267009cfb11e5c34d898ee"), "Name" : "John Doe" }
{ "_id" : ObjectId("5e267011cfb11e5c34d898ef"), "Name" : "Chris Brown" }

4. $regex를 활용한 빠른 접두어 검색

인덱스가 설정된 상태에서 다음과 같이 이름이 'John'으로 시작하는 문서를 검색해 보겠습니다. 핵심은 정규식 앞에 ^(캐럿) 기호를 붙여 접두어 매칭 조건을 만드는 것입니다.

> db.demo46.find({ Name: { $regex:/^John/}});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e267009cfb11e5c34d898ee"), "Name" : "John Doe" }
{ "_id" : ObjectId("5e267004cfb11e5c34d898ed"), "Name" : "John Smith" }

성능 최적화 핵심 포인트

정규식 검색이라고 해서 항상 느린 것은 아닙니다. 아래 두 가지 원칙만 지키면 인덱스를 효율적으로 활용할 수 있습니다.

  • 접두어 매칭 사용: /^John/처럼 문자열 시작 위치를 고정하면 MongoDB는 B-tree 인덱스 범위 스캔(range scan)을 수행해 전체 컬렉션을 확인하지 않습니다.
  • 중간·후방 매칭 주의: /John/ 또는 /Smith$/ 같은 패턴은 인덱스를 활용하지 못하고 컬렉션 전체 스캔(collscan)이 발생할 수 있으므로, 대용량 데이터에서는 피하는 것이 좋습니다.

이처럼 ensureIndex()로 필드에 인덱스를 미리 구성하고, $regex 검색 시 접두어 패턴을 사용하면 대용량 텍스트 필드에서도 빠른 쿼리 응답 속도를 확보할 수 있습니다.