Index 란
DB의 검색을 빠르게 하기 위해 미리 데이터의 순서를 정리해두는 과정
Index는 MongoDB에서 데이터 쿼리를 더욱 효율적으로 할 수 있게 해준다.
인덱스가 없이는, MongoDB는 collection scan – 컬렉션의 데이터를 하나하나 조회 – 방식으로 스캔을 하게 된다.
모든 도큐먼트를 스캔해야되는 비효율성을 줄임
한 쿼리당 하나의 index 만 유효하다.
두개의 index가 필요하다면 복합 index를 사용하면 된다.
* B트리
: 내부적으로 B-Tree 알고리즘을 이용하여 인덱스를 구성한다.
사용시 주의할 점
: 모든 인덱스를 갱신해야 하기 떄문에 모든 쓰기 작업은 인덱스 때문에 더 오래 걸림
: Collection 당 최대 64개까지 인덱스를 지닐수있지만, 2~3개만 지니는게 좋다.
: 몽고디비의 인덱스는 RDBMS와 유사하게 작동함
: 인덱스 구축시 background 옵션을 사용하면, 비동기로 작업이 가능하긴하지만 느리다.
Index 종류
기본 인덱스 _id
모든 MongoDB의 컬렉션은 기본적으로 _id 필드에 인덱스가 존재합니다. 만약에 컬렉션을 만들 때 _id 필드를 따로 지정하지 않으면 mongod드라이버가 자동으로 _id 필드 값을 ObjectId로 설정해준다.
Single(단일) 필드 인덱스
사용자가 지정 할 수 있는 단일 필드 인덱스가 있다.
Compound (복합) 필드 인덱스,
두개 이상의 필드를 사용하는 인덱스를 복합 인덱스라고 부른다. 다음 이미지와 같이 첫번째 필드 (userid)는 오름차순으로, 두번째 필드 (score)는 내림차순으로 정렬 해야 하는 상황이 있을때 사용한다.
Multikey 인덱스
필드 타입이 배열인 필드에 인덱스를 적용 할 때는 Multikey 인덱스가 사용됩니다. 이 인덱스를 통하여 배열에 특정 값이 포함되어 있는 document를 효율적으로 스캔
Geospatial(공간적) Index
지도의 좌표와 같은 데이터를 효율적으로 쿼리하기 위해서 (예: 특정 좌표 반경 x 에 해당되는 데이터를 찾을 때) 사용되는 인덱스
Text 인덱스
텍스트 관련 데이터를 효율적으로 쿼리하기 위한 인덱스
해쉬 (hashed) 인덱스
이 인덱스를 사용하면 B Tree가아닌 Hash 자료구조를 사용합니다. Hash는 검색 효율이 B Tree보다 좋지만, 정렬을 하지 않습니다.
인덱스 사용
인덱스 확인
> db.[컬렉션명].getIndexes() // Collection의 인덱스 확인
인덱스 생성
> db.[컬렉션명].ensureIndex({name:1}) // 1이면 오름차순, -1 이면 내림차순
인덱스 생성(백그라운드에서 생성, 비동기방식)
> db.[컬렉션명].ensureIndex({name:1},{background:true})
인덱스 생성시 오래걸리면 백그라운드에서 생산해야함.
인덱스 생성( 고유인덱스 )
> db.[컬렉션명].ensureIndex({name:1},{unique:true}) // unique 속성을 지정해서 중복데이터가 저장되지 못하게 하여, 데이터 저장과 검색속도를 늘린다.
* 인덱스 생성( 중복데이터 삭제 )
> db.[컬렉션명].ensureIndex({name:1},{unique:true, dropDups:true}) // Unique 하게 했을 때 이미 중복된 데이터가 있을 경우 중복되는 데이터는 삭제하고 인덱스를 저장한다
* Partial (부분적) 속성
> partial 속성은 document의 조건을 정하여 일부 document에만 인덱스를 적용 할 때 사용된다,.
partial 속성을 사용하면, 필요한 부분에만 인덱싱을 사용하여 저장공간도 아끼고 속도를 더 높일수 있다.
visitors 값이 1000 보다 높은 document에만 name 필드에 인덱스 적용
db.[컬렉션명].createIndex( { name: 1 }, { partialFilterExpression: { visitors: { $gt: 1000 } } } )
* ttl 속성 인덱스 생성
db.[컬렉션명].createIndex( { "notifiedDate": 1 }, { expireAfterSeconds: 3600 } )
예제: notifiedDate 가 현재 시각과 1시간 이상 차이나면 제거
document가 만료되어 제거 될 때, 시간이 아주 정확하지는 않다. 만료되는 document를 제거하는 thread는 매 60초마다 실행된다.
인덱스 삭제
> db.[컬렉션명].dropIndex({name:1}) // 해당 인덱스 제거
* 인덱스 삭제( 모든 인덱스)
> db.[컬렉션명].dropIndexes() // _id를 제외한 모든 인덱스 제거
몽고디비 공식 문서 (인덱스 가이드)
docs.mongodb.com/manual/indexes/
'DB > MongoDB' 카테고리의 다른 글
몽고디비 인덱스 생성 확인 및 취소하기 - 인덱스 생성전에 미리 알자 (0) | 2021.02.04 |
---|