1. Index 기본 개념
* 개념
: DB의 검색을 빠르게 하기 위해 미리 데이터의 순서를 정리해두는 과정
: index를 잘 설계해야 최대의 효율이 가능
: 고유 index, 희소 index, 다중키 index // 복합 index, 단일 index 지원
: 쿼리해오기 위한 작업량을 줄임 <- 모든 도큐먼트를 스캔해야되는 비효율성을 줄임
: 한 쿼리당 하나의 index만 유효
: 두개의 index가 필요하다면 복합 index를 사용하면 됨.
: 복합 index에서는 키의 순서가 중요
: _id는 기본적으로 생성되는 index로 도큐먼트를 가리키는 유일한 키값이다.
: 도큐먼트에 빠르게 접근할 때에 사용한다.
* Index 효율
: 모든 index에는 유지비가 소요되기 때문에 무한히 만드는 것은 의미가 없다.
: index는 읽기 위주의 어플리케이션에서 유용하다.
: 쓰기가 많다면 index를 포기하거나 컬렉션을 따로 운영해야 한다.
: Mongodb는 실행시 모든 데이터 파일을 메모리에 매핑한다.
: 모든 도큐먼트, 컬렉션, 인덱스를 포함하는 데이터 파일이 램에 적재
: 모든 데이터를 수용하지 못하면 운영체제가 디스크를 빈번하게 액세스하게 되고 읽기/쓰기 연산에 지연이 발생한다.
: Thrashing(쓰레싱) : 모든 데이터를 디스크에서 액세스해야 하는 경우 // 굉장한 성능저하 발생
: 복합인덱스는 더 많은 공간을 필요로 한다.
* B트리
: 내부적으로 B-Tree 알고리즘을 이용하여 인덱스를 구성한다.
: 트리에서 각 노드는 여러개의 키를 갖는 것이 가능
2. MongoDB index
* 인덱스 확인
> db.person.getIndexes() // Collection의 인덱스 확인
* 인덱스 생성
> db.person.ensureIndex({name:1}) // 1이면 오름차순, -1 이면 내림차순
* 인덱스 생성(백그라운드에서 생성, 비동기방식)
> db.person.ensureIndex({name:1},{background:true})
* 인덱스 생성( 고유인덱스 )
> db.person.ensureIndex({name:1},{unique:true}) // unique 속성을 지정해서 중복데이터가 저장되지 못하게 하여, 데이터 저장과 검색속도를 늘린다.
* 인덱스 생성( 중복데이터 삭제 )
> db.person.ensureIndex({name:1},{unique:true, dropDups:true}) // Unique 하게 했을 때 이미 중복된 데이터가 있을 경우 중복되는 데이터는 삭제하고 인덱스를 저장한다.
* 인덱스 삭제 ( 특정 필드 )
> db.person.dropIndex({name:1}) // 해당 인덱스 제거
* 인덱스 삭제( 모든 인덱스)
> db.person.dropIndexes() // _id를 제외한 모든 인덱스 제거
3. MongoDB Index 사용법
> db.users.find({username:"user101"}).explain() // 검색에 대한 상세 정보 출력
* 사용시 주의할 점
: 모든 인덱스를 갱신해야 하기 떄문에 모든 쓰기 작업은 인덱스 때문에 더 오래 걸림
: Collection 당 최대 64개까지 인덱스를 지닐수있지만, 2~3개만 지니는게 좋다.
: 몽고디비의 인덱스는 RDBMS와 유사하게 작동함
: 인덱스 구축시 background 옵션을 사용하면, 비동기로 작업이 가능하긴하지만 느리다.
'프로그래밍 > NoSQL - MongoDB' 카테고리의 다른 글
mongoDB 리플리카 셋으로 장애 대응방법 배우기 (0) | 2017.04.04 |
---|---|
MongoDB를 이용한 복제 방법 살펴보기 (0) | 2017.04.04 |
MongoDB 샤딩 (1) | 2017.04.03 |
MongoDB 명령어 (0) | 2017.04.03 |
NoSQL 개요 & MongoDB 개요 (0) | 2017.04.03 |