(MongoDB) Index

* Index를 사용하는 이유
- 거대한 컬렉션에 대해 Read Operation이 느릴때

  • Read Operation시 Table scan(정보전체에 대한 읽기)이 일어남
  • 거대한 컬렉션에 대해 Table scan이 일어난다면 서버는 Table scan이 일어나지 않도록 해야함

* Index의 효과
- 인덱스는 DB 테이블에 대한 동작속도를 높여주는 자료구조로, 저장된 자료에 대한 빠른조회를 위해 생성 (Index <-> Full Table Scan)

- 인덱스는 키-필드 형태를 가지며, Scan을 거치지 않고 , 원하는 문서 위치주소로 바로 이동함

Document의 필드(들)에 index를 걸면, 데이터의 설정한 키 값을 가지고 document들을 가르키는 포인터 값으로 이뤄진 B-Tree를 만듭니다.

* Index 생성시 알아둘 점
- 각 Index 는 8KB의 데이터 공간을 필요로 함
- Index생성시 write 및 update operation 성능을 떨어뜨림
- Index는 system.indexes 컬렉션에 저장됨


* 오름차순/내림차순에 대한 색인
- 키가 하나 일때는 키 방향이 무의미, 키가 하나 이상일 경우 고려함
  - 단일키에서 특정 M키는 방향과 관계없이 명확함

- 최적화시 정렬방향을 고려함
  • {"username":1, "age": -1} 내림차순 최적화
  • {"username":1, "age": 1} 오름차순 최적화
  • {"comments.date":1} 내장문서 comments에 있는 date 키에 대한 색인

* Index의 종류

모든 MongoDB의 컬렉션은 기본적으로 _id필드에 인덱스가 존재합니다.
만약에 컬렉션을 만들때 _id필드를 따로 지정하지 않으면 mongod 드라이버가 _id필드 값을 ObjectId로 설정해줍니다.

_id인덱스는 unique(유일)하고 이는 MongoDB 클라이언트가 같은 _id를 가진 문서를 중복적으로 추가하는 것을 방지합니다.


  • 해쉬(hashed) 인덱스 : 이 인덱스를 사용하면 B Tree가 아닌 Hash 자료구조를 사용합니다. Hash는 검색 효율이 B Tree 보다 좋지만, 정렬을 하지 않습니다.

* 인덱스 생성

인덱스를 생성 할 떈, 다음과 같이 createIndex() 메소드를 사용합니다. 파라미터는 인덱스를 적용할 필드를 전달합니다. 값을 1로하면 오름차순으로, -1로 하면 내림차순으로 정렬합니다.

db.COLLECTION.createIndex( { key : 1 } )

  • 복합 필드 인덱스 생성 :
-> db.report.createIndex( { age : 1, score : -1 } )


* 인덱스 속성

인덱스 속성을 추가 할 땐 createIndex() 메소드의 두 번쨰 인자에 속성값을 document 타입으로 전달해주면 됩니다.

  • Unique(유일함)속성 : _id 필드처럼 컬렉션에 단 한개의 값만 존재할 수 있는 속성
-> db.userInfo.createIndex( { email : 1 } , { unique : true } )

  • Partial(부분적)속성 : partial 속성은 document의 조건을 정하여 일부 document에만 인덱스를 적용할 때 사용됩니다. partial 속성을 사용하면 , 필요한 부분에만 인덱싱을 사용하여 저장공간도 아끼고 속도를 더 높일 수 있습니다.
-> 예) visitors값이 100 보다 높은 doucment에만 name 필드에 인덱스 적용

db.store.createIndex(
 { name : 1 },
 { partialFilterExpression : { visitors: { $gt : 1000 } } }
)

  • TLL 속성 : 이 인덱스 속성은 Date 타입, 혹은 Date 배열타입의 필드에 적용할 수 있는 속성입니다. 이 속성을 사용하여 document를 expire(만료) 시킬 수 있습니다. 즉, 추가하고 특정 시간이 지나면, document를 컬렉션에서 제거합니다.
-> 예) notifiedDate 가 현재 시각과 1시간 이상 차이나면 제거
db.notifications.createIndex( { "notifiedDate" : 1 }, { expireAfterSeconds : 3600 } )


* 인덱스 조회

-> 생성된 인덱스를 조회 할 땐 getIndexs() 메소드를 사용합니다.
db.COLLECTION.getIndexes()


* 인덱스 제거

db.COLLECTION.dropIndex( { key : 1 } )

(_id인덱스를 제외한) 모든 인덱스를 제거할 땐 dropIndexes()메소드를 사용합니다.






댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬