티스토리 뷰

develop

MongoDB Index

yogae 2020. 4. 13. 19:15

Index는 MongoDB에서 데이터 쿼리를 더욱 효율적으로 할 수 있게한다. 인덱스가 없이는, MongoDB는 collection을 scan 하게된다. 효과적인 인덱스 작성 전략을 위해 반드시 고려해야 하는 것이 바로 이 ‘Selectivity’를 높이는 것이다. 보다 정확하게 검색 할 수 있도록 좁은 범위를 갖는 색인을 만들어야 한다.

사용 할 수 있는 메모리 크기를 고려해야 한다. 인덱스는 실제 데이터와 별개의 메모리 공간에 저장을 하게 된다. 따라서 인덱스를 많이 만들다 보면 그만큼 많은 메모리를 사용하게 된다. 인덱스 검사를 위해 주로 사용하는 메소드에는 hint()와 explain()이 있다.

 

update, delete의 method를 사용하는 경우에도 index조건에 맞는 query를 사용하면 index를 사용하게 된다.

index 종류

single index

db.collection.createIndex({ “item”: 1 })

 

사용자가 지정할 수 있는 단일 필드 인덱스이다. 모든 collections는 _id 필드 index가 default로 설정되어 있다. 모든 collections는 _id 필드 index가 default로 설정되어 있다. sorting 순서와 상관없이 query할 수 있다. Index 생성 시 value에 1은 오름차순, -1 내림차순을 나타낸다. Index 생성 시 value에 1은 오름차순, -1 내림차순을 나타낸다. 단일 인덱스에서 오름차순으로 정의 된 인덱스의 컬렉션을 내림차순으로 검색해도 동일한 성능을 낸다.

Compound 인덱스

두개 이상의 필드를 사용하는 인덱스를 복합 인덱스이다. Compound index는 sorting 순서와 상관이 있다.

 

db.collection.createIndex({ “item”: 1, “stock”: -1 })

 

위와 같이 index를 생성하는 경우 먼저 item로 정렬되고 각각의 item 내에서 stock으로 정렬이 된다. item으로 먼저 정렬하고 stock을 정렬하는 경우에는 검색 효율이 좋지만 stock만으로 정렬하거나 stock, item 순으로 정렬하는 경우는 효율이 좋지 않다. 그런 경우에는 stock을 위한 인덱스를 따로 만들어주는 것이 성능에 이점이 있다.

 

db.collection.find().sort( { item: 1, stock: 1 } ) // indexing되지 않는다.
db.collection.find().sort( { item: -1, stock: -1 } ) // indexing되지 않는다.
db.collection.find().sort( { item: 1, stock: -1 } ) // indexing 된다.
db.collection.find().sort( { item: -1, stock: 1 } ) // indexing 된다.
db.collection.find().sort( { item: -1 } ) // indexing 된다.
db.collection.find().sort( { item: 1 } ) // indexing 된다.
db.collection.find().sort( { stock: 1 } ) // indexing되지 않는다.
db.collection.find().sort( { stock: -1 } ) // indexing되지 않는다.

 

find query의 순서와는 상관이 없다.

 

db.collection.find({“stock”: “a”, “item”: 1) // indexing 된다.
db.collection.find({“item”: 1, “stock”: “a”) // indexing 된다.

db.collection.find({“item”: 1) // indexing 된다. (prefix로 indexing 된다.)
db.collection.find({“stock”: "a") // indexing되지 않는다.

 

regex 표현식을 사용하는 경우 index가 조금 다르게 동작한다. 

 

db.collection.find({ item: RegExp(/1/) }).sort({ stock: 1 }) # regex 표현식을 사용하는 경우

db.collection.find({ item: 1 }).sort({ stock: 1 }) # regex 표현식을 사용하지 않는 경우

 

 

위의 두 경우 모두 index을 사용하여 검색하지만 regex를 사용하는 경우 다시 한번 sorting하게되고 regex를 사용하지 않는 경우 sorting을 하지 않는다. regex 표현을 사용하는 query문에서 효율을 높이기 위해서는 아래와 같이 index sorting 순서를 지켜주어야 한다.

 

db.collection.find({ item: RegExp(/1/) }).sort({ item: 1, stock: -1 })
db.collection.find({ item: RegExp(/1/) }).sort({ item: -1, stock: -1 })
db.collection.find({ item: RegExp(/1/) }).sort({ item: 1 })
db.collection.find({ item: RegExp(/1/) }).sort({ item: -1 })

 

Multikey 인덱스

Array value를 indexing하기 위해 사용한다.Array value를 indexing하기 위해 사용한다. 몽고디비는 배열의 모든 요소에 대해 개별의 인덱스 개체들를 생성한다. 이 멀티키 인덱스는 그 배열들의 요소나 요소들에 매치하여 배열을 가지는 도큐먼트를 선택하는 쿼리를 가능하게 한다.

'develop' 카테고리의 다른 글

자연어 전처리  (0) 2020.05.24
stream 사용(Node.js와 web client 간 통신)  (0) 2020.05.16
Clickjacking 보호  (0) 2020.04.13
MongoDB Slow operation을 확인하는 방법  (1) 2020.04.02
Error 객체 JSON.stringify()  (0) 2020.03.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함