본문 바로가기
DB

[MongoDB] Index 걸기 및 주의사항

by 오늘의개발부 2022. 2. 24.
반응형

Index

index 확인

> db.users.getIndexes();
< [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]

인덱스 생성: 오름차순(1), 내림차순(-1)
db.users.createIndex({필드명: 1 or -1})

> db.users.createIndex({name: 1})

백그라운드 옵션: {background: true}
이미 데이터가 많은 경우 인덱스를 생성하는 과정에서 오랜 시간이 소요될 수 있음

> db.users.createIndex({name: 1}, {background: true})

고유 인덱스 생성: {unique: true}
중복 데이터가 생성되지 못하도록 함. 데이터 저장과 검색속도 향상에 도움이 됨.

> db.users.createIndex({name: 1}, {unique: true, dropDups: true})

특정필드 인덱스 삭제: dropIndex({"name":1});

> db.user.dropIndex({"name":1});

모든 인덱스 삭제: dropIndexes();

> db.user.dropIndexex();

인덱스 설정에 따른 검색속도 개선

  1. 대량의 테스트 데이터 생성
for(i = 0; i < 1000000; i++){
    db.users.insert({
        "i": i,
        "username" : "user_" + i,
        "age": Math.floor(Math.random() * 120),
        "created" : new Date()
    });
}
  1. 인덱스가 없는 상태에서 조회후 소요시간 확인
> db.users.find({username: 'user_90100'}).explain('executionStats');
<{
<    ...
<    "executionStats" : {
<            ...
<            "executionTimeMillis" : 621,
<            ...
<    },
<    ...
<}
  1. 인덱스 생성
> db.users.createIndex({"username": 1});
  1. 다시 조회 후 소요시간 확인
> db.users.find({username: 'user_90100'}).explain('executionStats');
<{
<    ...
<    "executionStats" : {
<            ...
<            "executionTimeMillis" : 1,
<            ...
<    },
<    ...
<}

인덱스 사용시 주의사항

모든 쓰기(읽기, 갱신, 삭제) 작업은 인덱스 때문에 더 오래 걸림
데이터가 변경될 때마다 문서 자체와 모든 인덱스를 갱신함
몽고디비는 콜렉션당 최대 64개까지 인덱스를 가지도록 제한됨
일반적으로 콜렉션에 2~3개 이상의 인덱스를 가지지 않는 게 좋음
몽고디비는 인덱스 구축이 완료될 때까지 DB의 모든 읽기 쓰기를 중단하고 인덱스를 구축하게 됨
background 옵션을 사용하면 인덱스 구축 중 다른 작업이 가능하나 인덱스 구축 속도는 느림

반응형