희소 인덱스에는 인덱스 필드에 null 값이 포함되어 있더라도 인덱스된 필드가 있는 문서에 대한 항목만 포함됩니다. 인덱스는 인덱스된 필드가 누락된 모든 문서를 건너뜁니다. 인덱스는 컬렉션의 모든 문서를 포함하지 않으므로 " sparse " 입니다. 반대로 희소가 아닌 인덱스는 컬렉션의 모든 문서를 포함하며 인덱싱된 필드를 포함하지 않는 문서에 대해서는 null 값을 저장합니다.
중요
부분 인덱스 는 희소 인덱스로 작동할 수 있지만 필드 존재 여부 이상의 조건에 대한 필터하다 표현식도 지원 . 정확한 필터링이 필요한 경우 부분 인덱스 사용하여 더 효과적으로 제어할 수 있습니다.
희소 인덱스 만들기
희소 인덱스를 만들려면 sparse 옵션을 true 로 설정한 상태에서 db.collection.createIndex() 메서드를 사용하십시오.
예를 들어 mongosh에서 다음 연산은 movies 컬렉션의 plot 필드에 희소 인덱스를 생성합니다.
db.movies.createIndex( { "plot": 1 }, { sparse: true } )
인덱스는 plot 필드를 포함하지 않는 문서의 인덱스를 생성하지 않습니다.
참고
MongoDB의 희소 인덱스를 다른 데이터베이스의 블록 수준 인덱스와 혼동하지 마세요. 해당 인덱스는 특정 필터가 있는 밀집 인덱스라고 생각하면 됩니다.
행동
희소 인덱스 및 불완전한 결과
희소 인덱스로 인해 쿼리 및 정렬 작업에 대한 불완전한 결과 집합이 생성되는 경우, hint()가 인덱스를 명시적으로 지정하지 않는 한 MongoDB는 해당 인덱스를 사용하지 않습니다.
예를 들어 { plot: { $exists: false } } 쿼리는 명시적으로 힌트를 주지 않는 한 plot 필드의 희소 인덱스를 사용하지 않습니다. 동작에 대한 자세한 예시는 컬렉션의 희소 인덱스가 전체 결과를 반환할 수 없음을 참조하세요.
컬렉션의 모든 문서에 대해 count()(을)를 수행할 때 희소 인덱스를 지정하는 hint()(을)를 포함하면 (즉, 빈 쿼리 술어 사용), 희소 인덱스로 인해 잘못된 카운트가 발생하더라도 희소 인덱스가 사용됩니다.
예시 들어 movies 컬렉션 의 rated 필드 에 희소 인덱스 만듭니다.
db.movies.createIndex( { rated: 1 }, { sparse: true } )
movies 컬렉션 의 문서 수를 계산하고 해당 희소 인덱스 지정하는 힌트를 포함하면 작업은 rated 필드 포함된 문서만 반환합니다.
db.movies.countDocuments( {}, { hint: { rated: 1 } } )
컬렉션 의 문서 수를 올바르게 movies 계산하려면 컬렉션 의 모든 문서 hint() 수를 계산할 때 희소 인덱스 사용하여 을(를) 사용하지 마세요.
db.movies.countDocuments()
기본적으로 희소로 설정되는 인덱스
다음 인덱스 유형은 항상 희소 설정을 갖습니다.
희소 복합 인덱스
복합 인덱스에는 다양한 유형의 희소 인덱스가 포함될 수 있습니다. 인덱스 유형의 조합이 복합 인덱스가 문서를 어떻게 매칭하는지 결정합니다.
이 표에는 다양한 유형의 희소 인덱스가 포함된 복합 인덱스의 동작이 요약되어 있습니다.
복합 인덱스 구성 요소 | 컴파운드 인덱스 동작 |
|---|---|
Ascending indexes Descending indexes | 적어도 하나의 키에 대한 값을 포함하는 문서만 인덱싱합니다. |
문서에 | |
|
Sparse 하고 고유한 속성
희소성과 고유성을 모두 갖춘 인덱스는 컬렉션에서 중복된 필드 값을 가진 문서가 있는 것을 방지하지만 키를 생략한 여러 문서를 허용합니다.
예시
컬렉션에 희소 인덱스 만들기
다음 예시 password 필드 에 희소 인덱스 만듭니다.
db.users.createIndex( { password: 1 } , { sparse: true } )
그런 다음 users 컬렉션 에 대한 다음 쿼리 희소 인덱스 사용하여 password 필드 있는 문서를 반환합니다.
db.users.find( { password: { $exists: true } } ).sort({ password: 1 }).limit(5)
사용자에 password 필드 포함되어 있지 않으면 쿼리 해당 사용자를 반환하지 않습니다.
컬렉션의 희소 인덱스가 완전한 결과를 반환할 수 없음
일부 문서에 plot 필드 없는 movies 컬렉션 생각해 보세요.
다음 예시 plot 필드 에 희소 인덱스 만듭니다.
db.movies.createIndex( { "plot": 1 }, { sparse: true } )
movies 컬렉션의 모든 문서를 plot 필드로 정렬하여 반환하는 다음 쿼리를 고려해 보세요.
db.movies.find().sort( { plot: -1 } )
인덱싱된 필드 기준으로 정렬하더라도 movies 컬렉션 의 일부 문서에 plot 필드 없는 경우 MongoDB 완전한 결과를 반환하기 위해 쿼리 수행할 희소 인덱스 선택하지 않습니다.
희소 인덱스를 사용하려면 hint()로 인덱스를 명시적으로 지정합니다.
db.movies.find().sort( { plot: -1 } ).hint( { plot: 1 } ).limit(5)
이 쿼리 plot 필드 포함된 movies 컬렉션 의 문서만 반환합니다.
고유 제약 조건이 있는 희소 인덱스
다음 작업은 의 필드 에 고유 제약 조건 및 희소 필터하다 있는 인덱스 생성합니다.password users
db.users.createIndex( { password: 1 } , { sparse: true, unique: true } )
이 인덱스는 password 필드에 대해 고유한 값을 가진 문서의 삽입을 허용하거나 password 필드를 포함하지 않는 문서를 허옹합니다. 따라서 users 컬렉션의 기존 문서가 주어졌을 때 인덱스는 다음과 같은 삽입 작업을 허용합니다.
db.users.insertMany( [ { "name": "Jon Snow", "email": "jon@gameofthron.es", "password": "$2b$12$newHashedPassword1234567890ABC" }, { "name": "Sansa Stark", "email": "sansa@gameofthron.es", "password": "$2b$12$anotherNewPassword1234567890DEF" }, { "name": "Bran Stark", "email": "bran@gameofthron.es" } ] )
그러나 인덱스 는 컬렉션 에 이미 존재하는 이메일 주소가 포함된 문서의 추가를 허용하지 않습니다.
희소 및 비희소 고유 인덱스
MongoDB 5.0부터는 동일한 키 패턴을 가진 고유한 희소 인덱스와 고유한 비희소 인덱스가 단일 컬렉션에 존재할 수 있습니다.
고유하고 희소성 있는 인덱스 생성
이 예시에서는 동일한 키 패턴과 다른 sparse 옵션을 사용하여 여러 인덱스를 만듭니다.
db.users.createIndex( { password : 1 }, { name: "unique_index", unique: true } )
db.users.createIndex( { password : 1 }, { name: "unique_sparse_index", unique: true, sparse: true } )
기본 및 희소 인덱스 생성
sparse 옵션을 사용하거나 사용하지 않고 동일한 키 패턴으로 기본 인덱스를 생성할 수도 있습니다.
db.users.createIndex( { password : 1 }, { name: "sparse_index", sparse: true } )
db.users.createIndex( { password : 1 }, { name: "basic_index" } )