쿼리를 지원하는 인덱스 생성
이 페이지의 내용
인덱스는 쿼리에 의해 스캔된 모든 필드를 포함하는 경우 쿼리를 지원합니다. 쿼리는 컬렉션이 아니라 인덱스를 스캔합니다. 쿼리를 지원하는 인덱스를 생성하면 쿼리 성능이 크게 향상됩니다.
이 문서에서는 쿼리를 지원하는 인덱스를 생성하기 위한 전략을 설명합니다.
모든 쿼리가 동일한 단일 키를 사용하는 경우 단일 키 인덱스 생성
특정 컬렉션에서 단일 키에 대해서만 쿼리하는 경우, 해당 컬렉션에 대해 단일 키 인덱스를 하나만 생성하면 됩니다. 예를 들어, product
컬렉션에서 category
에 대한 인덱스를 생성할 수 있습니다.
db.products.createIndex( { "category": 1 } )
서로 다른 여러 가지 쿼리를 지원하는 복합 인덱스 생성
때로는 하나의 키에 대해서만 쿼리하고 다른 경우에는 해당 키를 두 번째 키와 결합하여 쿼리하고자 한다면, 단일 키 인덱스를 생성하는 것보다 복합 인덱스를 생성하는 것이 더 효율적입니다. MongoDB는 두 쿼리 모두에 복합 인덱스를 사용합니다. 예를 들어 category
와 item
모두에 대한 인덱스를 생성할 수 있습니다.
db.products.createIndex( { "category": 1, "item": 1 } )
이렇게 하면 두 가지 옵션을 모두 사용할 수 있습니다. category
만 쿼리할 수도 있고, category
와 item
을 결합하여 쿼리할 수도 있습니다. 여러 필드에 대한 단일 복합 인덱스는 해당 필드의 '접두사' 하위 집합을 검색하는 모든 쿼리를 지원할 수 있습니다.
예시
컬렉션에 대해 다음과 같은 인덱스가 있습니다.
{ x: 1, y: 1, z: 1 }
다음의 인덱스가 지원하는 쿼리를 지원할 수 있습니다.
{ x: 1 } { x: 1, y: 1 }
접두사 인덱스가 더 나은 쿼리 성능을 제공할 수 있는 몇 가지 상황이 있습니다(예시: z
가 큰 배열인 경우).
{ x: 1, y: 1, z: 1 }
인덱스는 다음 인덱스와 동일한 쿼리를 다수 지원할 수도 있습니다.
{ x: 1, z: 1 }
또한 { x: 1, z: 1 }
에는 추가 용도가 있습니다. 다음의 쿼리를 살펴보세요.
db.collection.find( { x: 5 } ).sort( { z: 1} )
{ x: 1, z: 1 }
인덱스는 쿼리와 정렬 작업을 모두 지원하는 반면, { x: 1, y: 1, z: 1 }
인덱스는 쿼리만 지원합니다. 정렬에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요.
버전 2.6부터 MongoDB는 인덱스 교차 를 사용하여 쿼리를 처리할 수 있습니다. 쿼리를 지원하는 복합 인덱스를 생성할지, 아니면 인덱스 교차에 의존할지 여부는 시스템의 특성에 따라 달라집니다. 자세한 내용은 인덱스 교차 및 복합 인덱스 에서 확인 가능합니다.
텍스트 검색을 지원하는 인덱스 생성
MongoDB Atlas에서 호스팅되는 데이터의 경우 Atlas Search 인덱스를 사용하여 전체 텍스트 검색을 지원할 수 있습니다. 자세한 내용은 Atlas Search 인덱스 생성을 참조하세요.
(Atlas가 아닌) 자체 관리 배포서버의 경우, MongoDB 는 컬렉션 에서 string 콘텐츠 검색을 지원하는 text
인덱스 유형을 제공합니다. 자체 관리형 텍스트 인덱스에 학습 보려면 자체 관리형 배포의 텍스트 인덱스를 참조하세요.
인덱스 사용 및 데이터 정렬
문자열 비교에 인덱스를 사용하려면 작업에서 동일한 데이터 정렬도 지정해야 합니다. 즉, 작업에서 다른 데이터 정렬을 지정하는 경우 데이터 정렬이 있는 인덱스는 인덱싱된 필드에서 문자열 비교를 수행하는 작업을 지원할 수 없습니다.
경고
데이터 정렬로 구성된 인덱스는 ICU 데이터 정렬 키를 사용하여 정렬 순서를 지정하므로, 데이터 정렬이 없는 인덱스의 경우 데이터 정렬 인식 인덱스 키가 인덱스 키보다 클 수 있습니다.
예를 들어, 컬렉션 myColl
에는 대조 국가 및 언어 설정이 "fr"
인 문자열 필드 category
에 대한 색인이 있습니다.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
인덱스와 동일한 데이터 정렬을 지정하는 다음 쿼리 작업에서는 인덱스를 사용할 수 있습니다.
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
하지만 기본적으로 '단순' 바이너리 데이터 정렬기를 사용하는 다음 쿼리 작업에서는 인덱스를 사용할 수 없습니다.
db.myColl.find( { category: "cafe" } )
인덱스 접두사 키가 문자열, 배열 및 내장된 문서가 아닌 복합 인덱스의 경우, 다른 데이터 정렬을 지정하는 작업에서도 인덱스를 사용하여 인덱스 접두사 키에 대한 비교를 지원할 수 있습니다.
예를 들어, 컬렉션 myColl
에는 숫자 필드 score
및 price
와 문자열 필드 category
에 복합 인덱스가 있습니다. 인덱스는 문자열 비교를 위해 데이터 정렬 국가 및 언어 설정 "fr"
을 사용하여 만들어집니다.
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
문자열 비교에 "simple"
이진 데이터 정렬을 사용하는 다음 작업에서는 인덱스를 사용할 수 있습니다.
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
색인이 생성된 category
필드의 문자열 비교를 위해 "simple"
이진 데이터 정렬을 사용하는 다음 작업은 색인을 사용하여 쿼리의 score: 5
부분만 수행할 수 있습니다.
db.myColl.find( { score: 5, category: "cafe" } )
중요
내장된 문서 키를 비롯한 문서 키와의 일치는 단순 이진 비교를 사용합니다. 즉, "foo.bár"와 같은 키에 대한 쿼리는 "foo.bar" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.