저장된 데이터 크기가 커질수록, 쿼리의 결과를 얻기까지 기다리는 시간은 늘어난다. 쿼리의 속도가 느려지는 경우를 해결하기 위한 방법 중 하나로 인덱싱을 사용할 수 있습니다.
각 대상의 위치가 표시된 곳, 해당 대상이 언급된 페이지로 바로 이동 가능한 참조라 생각하면 좋다.
예를들면 "아이폰" 찾기 위해서 모든 페이지를 찾는 것보다는 ㅇ 섹션으로 이동해 "아이폰"을 찾는 것이 빠르다.
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}});
Index를 생성하기 위해서는 createIndex()라는 메소드를 사용합니다.
createIndex의 파라미터로 인덱스를 적용할 필드를 전달합니다.
이에 따르는 값을 1로 지정하면 오름차순, -1은 내림차순으로 정렬합니다.
(property 또한 추가할 수 있습니다.)
ex) 예시
db.collection.createIndex({<필드명>:1}, {<property>: true})
ex) user_id 필드의 index를 중복 값이 없는 유일한 필드로 생성합니다.
db.members.createIndex({"user_id": 1}, {unique: true})
Document 조건을 정해 일부 Document에만 인덱스를 적용합니다.
Partial을 사용하면, 필요한 부분에만 인덱스를 사용하여 효율적으로 쿼리할 수 있습니다.
이를 위해 partialFilterExpression 옵션을 사용합니다.
ex) restaurants Collection에서 cuisine, name 이라는 두 개의 필드를 사용하여 다중 인덱스를 생성합니다. 이때 4점 이상인 Document에만 적용됩니다.
db.restaurants.createIndex({"cuisine":1, "name":1}, {partialFilterExpression: {rating:{$gt:4}}})
Date 혹은 Date 배열 타입의 필드에만 적용 가능합니다.
특정 시간이 지난 후 Document Collection에서 삭제합니다.
Index에 TTL 속성을 추가하고, 이에 따라 lastModifiedDate와 3600초 이상 차이나면 Document Collection에서 제거합니다.
db.eventLog.createIndex({"lastModifiedDate": 1}, {expireAfterSeconds: 3600})
생성된 인덱스를 조회할 때는 getIndexes 메소드를 사용하고
삭제를 할 때는 dropIndex를 사용합니다.
ex) 생성된 인덱스를 조회할 때
db.collection.getIndexes()
ex) 인덱스를 삭제할 때
db.collection.dropIndex(name);