쿼리를 지원하는 인덱스 생성
이 페이지의 내용
인덱스는 쿼리에 의해 스캔된 모든 필드를 포함하는 경우 쿼리를 지원합니다. 쿼리는 컬렉션이 아니라 인덱스를 스캔합니다. 쿼리를 지원하는 인덱스를 생성하면 쿼리 성능이 크게 향상됩니다.
이 문서에서는 쿼리를 지원하는 인덱스를 생성하기 위한 전략을 설명합니다.
모든 쿼리가 동일한 단일 키를 사용하는 경우 단일 키 인덱스 생성
특정 컬렉션에서 단일 키에 대해서만 쿼리하는 경우, 해당 컬렉션에 대해 단일 키 인덱스를 하나만 생성하면 됩니다. 예를 들어, 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 }
인덱스는 쿼리만 지원합니다. 정렬에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요.
텍스트 검색을 지원하는 인덱스 생성
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" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.