쿼리가 비효율적인 정규식 일치에 의존하는 경우 집계 파이프라인 단계에서 $search MongoDB Search 쿼리 만들고 실행 쿼리 매개변수를 사용자 지정할 수 있는 더 많은 옵션이 있는 텍스트 쿼리의 성능을 개선합니다.
비효율적인 정규식 일치 피하기
대소문자를 구분하지 않는 정규식 쿼리를 자주 실행 경우(i 옵션 활용), 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 사용하는 것이 좋습니다.
인덱스에 데이터 정렬 을 지정하여 대소문자 및 악센트 표시 규칙과 같은 문자열 비교를 위한 언어별 규칙을 정의할 수 있습니다. 그러나데이터 정렬은 MongoDB Search 쿼리에 비해 일부 기능 손실을 일으킬 수 있습니다. MongoDB Search 환경이 아닌 경우 대소문자를 구분하지 않는 인덱스는 정규식 쿼리의 성능을 향상시키지 않습니다. $regex 쿼리 연산자 데이터 정렬을 인식하지 못하며 사용 사례 수 없습니다. MongoDB Search 인덱스 는 대소문자 구분 쿼리의 성능을 크게 향상시키고 쿼리 매개변수를 사용자 지정할 수 있는 더 많은 옵션을 제공합니다.
예시
다음 문서가 포함된 employees 컬렉션을 생각해 보세요. 이 컬렉션에는 기본 _id 인덱스 외에 인덱스가 없습니다:
// employees collection { "_id": 1, "first_name": "Hannah", "last_name": "Simmons", "dept": "Engineering" }, { "_id": 2, "first_name": "Michael", "last_name": "Hughes", "dept": "Security" }, { "_id": 3, "first_name": "Wendy", "last_name": "Crawford", "dept": "Human Resources" }, { "_id": 4, "first_name": "MICHAEL", "last_name": "FLORES", "dept": "Sales" }
애플리케이션 에서 first_name 필드 자주 쿼리하는 경우 대소문자를 구분하지 않는 정규식 쿼리를 실행 일치하는 이름을 더 쉽게 찾을 수 있습니다. 대소문자를 구분하지 않는 정규식은 위의 예시 에서 'Michael'과 'MICHAEL'이 모두 first_names 인 경우와 같이 서로 다른 데이터 형식과도 일치합니다. 그러나 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 권장합니다.
사용자가 문자열 'michael'을 검색하면 애플리케이션은 다음 쿼리를 실행할 수 있습니다.
db.employees.find( { first_name: { $regex: /michael/i } } )
이 쿼리는 $regex 옵션 i를 지정하므로 대소문자를 구분하지 않습니다. 이 쿼리는 다음 문서를 반환합니다.
{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" } { "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }
이 쿼리 예상 문서를 반환하지만 인덱스 지원 하지 않고 대소문자를 구분하지 않는 정규식 쿼리는 성능이 그다지 좋지 않습니다. 성능을 개선하려면 MongoDB Search 인덱스 생성:합니다.
{ "mappings": { "dynamic": true } }
데이터 정렬로 인해 일부 기능이 손실될 수 있습니다. 인덱스 collation 문서의 strength 필드가 1 또는 2인 경우 인덱스는 대소문자를 구분하지 않습니다. 데이터 정렬 문서와 다양한 strength 값에 대한 자세한 설명은 데이터 정렬 문서를 참조하세요.
애플리케이션 에서 대소문자를 구분하지 않는 인덱스 사용하려면 regex 쿼리 의 인덱스 에서 동일한 데이터 정렬 문서 지정해야 합니다. $regex 이전 메서드에서 연산자 제거 find() 하고 새로 생성된 인덱스 사용할 수 있지만 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리 사용하는 것이 좋습니다.
대소문자를 구분하지 않는 쿼리 | MongoDB 검색 쿼리 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
중요
쿼리 에 대소문자를 구분하지 않는 인덱스 사용할 때는 $regex 연산자 사용하지 마세요. $regex 구현 데이터 정렬을 인식하지 못하며 대소문자를 구분하지 않는 인덱스를 사용할 수 없습니다. 대신 집계 파이프라인 단계를 $search 사용하는 MongoDB Search 쿼리를 권장합니다.
자세히 알아보기
MongoDB Search 쿼리에 대해 자세히 학습하려면 쿼리 및 인덱스를 참조하세요.
대소문자를 구분하지 않는 인덱스에 대해 더욱 자세히 알아보려면 대소문자를 구분하지 않는 인덱스를 참조하세요.
MongoDB의 정규식 쿼리에 대해 자세히 알아보려면 $regex를 참조하세요.
MongoDB University는 MongoDB 성능 최적화에 대한 무료 과정을 제공합니다. 자세한 내용은 모니터링 및 인사이트를 참조하세요.