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

정규식 사용 시 MongoDB 성능 문제를 방지하는 방법

정규식 사용 시 MongoDB 성능 문제를 방지하는 방법

MongoDB에서 $regex 연산자로 문자열을 검색할 때 적절한 인덱스가 없으면 전체 컬렉션 스캔(collection scan)이 발생하여 성능이 크게 저하될 수 있습니다. 이러한 성능 문제를 방지하려면 인덱스(index) 개념을 올바르게 활용해야 합니다.

아래 예제에서는 텍스트 인덱스를 생성하고, 대소문자를 구분하지 않는 정규식 검색을 수행하는 전체 과정을 단계별로 살펴보겠습니다.

1단계: 인덱스 생성 및 문서 삽입

먼저 createIndex() 메서드를 사용해 CountryName과 Name 필드에 텍스트 인덱스를 생성한 후, 여러 개의 문서를 삽입합니다.

> db.demo531.createIndex({"CountryName":"text","Name":"text"});{   "createdCollectionAutomatically" : true,   "numIndexesBefore" : 1,   "numIndexesAfter" : 2,   "ok" : 1}> db.demo531.insertOne({CountryName:"US","Name":"Chris"});{   "acknowledged" : true,   "insertedId" : ObjectId("5e8b2b60ef4dcbee04fbbbf2")}> db.demo531.insertOne({CountryName:"UK","Name":"David"});{   "acknowledged" : true,   "insertedId" : ObjectId("5e8b2b6cef4dcbee04fbbbf3")}> db.demo531.insertOne({CountryName:"AUS","Name":"chris"});{   "acknowledged" : true,   "insertedId" : ObjectId("5e8b2b74ef4dcbee04fbbbf4")}> db.demo531.insertOne({CountryName:"US","Name":"CHRIS"});{   "acknowledged" : true,   "insertedId" : ObjectId("5e8b2badef4dcbee04fbbbf5")}

2단계: 컬렉션의 모든 문서 조회

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

> db.demo531.find();

위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{ "_id" : ObjectId("5e8b2b60ef4dcbee04fbbbf2"), "CountryName" : "US", "Name" : "Chris" }{ "_id" : ObjectId("5e8b2b6cef4dcbee04fbbbf3"), "CountryName" : "UK", "Name" : "David" }{ "_id" : ObjectId("5e8b2b74ef4dcbee04fbbbf4"), "CountryName" : "AUS", "Name" : "chris" }{ "_id" : ObjectId("5e8b2badef4dcbee04fbbbf5"), "CountryName" : "US", "Name" : "CHRIS" }

3단계: 정규식 쿼리 실행

다음은 CountryName이 "US"이면서 Name 필드가 "chris"와 대소문자 구분 없이 일치하는 문서를 조회하는 정규식 쿼리입니다. $options: "i" 옵션은 대소문자를 무시하도록 지정하며, limit()으로 반환 문서 수를 제한했습니다.

> db.demo531.find({CountryName: "US", "Name": { "$regex": "chris", "$options": "i" }}).limit(4);

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

{ "_id" : ObjectId("5e8b2b60ef4dcbee04fbbbf2"), "CountryName" : "US", "Name" : "Chris" }{ "_id" : ObjectId("5e8b2badef4dcbee04fbbbf5"), "CountryName" : "US", "Name" : "CHRIS" }

성능 최적화를 위한 추가 팁

  • 정규식 쿼리가 인덱스를 효율적으로 활용하려면 접두사 기반 검색(예: /^chris/) 형태로 작성하는 것이 좋습니다.
  • 대소문자 무시(i) 옵션은 인덱스 활용을 제한할 수 있으므로, 가능하면 데이터 저장 시점에 대소문자 형식을 통일하는 것이 바람직합니다.
  • limit()을 함께 사용하면 반환되는 문서 수를 줄여 응답 속도를 개선할 수 있습니다.