[CS] MongoDB Index Day-56

cptkuk91·2022년 2월 2일
0

CS

목록 보기
93/139

저장된 데이터 크기가 커질수록, 쿼리의 결과를 얻기까지 기다리는 시간은 늘어난다. 쿼리의 속도가 느려지는 경우를 해결하기 위한 방법 중 하나로 인덱싱을 사용할 수 있습니다.

Index

각 대상의 위치가 표시된 곳, 해당 대상이 언급된 페이지로 바로 이동 가능한 참조라 생각하면 좋다.

예를들면 "아이폰" 찾기 위해서 모든 페이지를 찾는 것보다는 ㅇ 섹션으로 이동해 "아이폰"을 찾는 것이 빠르다.

MongoDB에서 Index도 이와 동일한 역할을 한다.
데이터를 탐색하기 쉬운 형식으로 Index를 저장해야 하기 때문이다.

ex) people collection에서 180cm인 사람을 찾아, 몸무게 순으로 정렬하고 싶을 때

db.people.find({"height": 180}).sort("weight": 1).pretty();

위 쿼리는 people이라는 collection에서 키 180인 사람을 찾고 몸무게 순으로 정렬해준다.

height, weight를 기준으로 다중 index를 만들면, 모든 Document를 조회할 필요가 없습니다.

ex) 실전 예시-2 (키가 170이하인 사람을 찾고 싶을 때)

db.people.find({"height": {$lt: 170}});

createIndex

Index를 생성하기 위해서는 createIndex()라는 메소드를 사용합니다.

createIndex의 파라미터로 인덱스를 적용할 필드를 전달합니다.

이에 따르는 값을 1로 지정하면 오름차순, -1은 내림차순으로 정렬합니다.
(property 또한 추가할 수 있습니다.)

ex) 예시

db.collection.createIndex({<필드명>:1}, {<property>: true})

Unique(유일함)을 _id 필드에 추가할 수 있습니다. 단 한개의 값만 존재할 수 있는 속성입니다.

ex) user_id 필드의 index를 중복 값이 없는 유일한 필드로 생성합니다.

db.members.createIndex({"user_id": 1}, {unique: true})

Partial

Document 조건을 정해 일부 Document에만 인덱스를 적용합니다.
Partial을 사용하면, 필요한 부분에만 인덱스를 사용하여 효율적으로 쿼리할 수 있습니다.

이를 위해 partialFilterExpression 옵션을 사용합니다.

ex) restaurants Collection에서 cuisine, name 이라는 두 개의 필드를 사용하여 다중 인덱스를 생성합니다. 이때 4점 이상인 Document에만 적용됩니다.

db.restaurants.createIndex({"cuisine":1, "name":1}, {partialFilterExpression: {rating:{$gt:4}}})

TTL (Time To Live)

Date 혹은 Date 배열 타입의 필드에만 적용 가능합니다.
특정 시간이 지난 후 Document Collection에서 삭제합니다.
Index에 TTL 속성을 추가하고, 이에 따라 lastModifiedDate와 3600초 이상 차이나면 Document Collection에서 제거합니다.

db.eventLog.createIndex({"lastModifiedDate": 1}, {expireAfterSeconds: 3600})

getIndexes, dropIndex

생성된 인덱스를 조회할 때는 getIndexes 메소드를 사용하고
삭제를 할 때는 dropIndex를 사용합니다.

ex) 생성된 인덱스를 조회할 때

db.collection.getIndexes()

ex) 인덱스를 삭제할 때

db.collection.dropIndex(name);

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)

0개의 댓글