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 옵션을 사용하면, 비동기로 작업이 가능하긴하지만 느리다.



+ Recent posts