Loading...

DB/MongoDB / / 2022. 5. 2. 15:46

몽고DB 9강. 인덱스 개념

반응형

 

인덱스가 없으면 SELECT 할 때 풀 스캔을 하게 된다.

_id는 기본적으로 생성되는 인덱스이고 도큐먼트를 가리키는 유일한 키 값(PK)으로 사용된다.

이 키 값은 해시로 만들어진다.

 

컬렉션을 posts라고 하고, 문서 하나를 post라고 해보자.

하나의 게시글은 여러 개의 댓글을 가질 수 있다.

즉, 필드에 comments 컬렉션을 가지고 있을 수 있다.

그리고 이 컬렉션 안에는 comment 문서를 가지고 있다.

 

 

8번 게시글만 댓글을 가지고 있을 때

8번 게시글을 SELECT 할 때 comments 컬렉션도 같이 나온다.

 

만약 전체 댓글처럼 댓글만 찾고 싶을 때는 게시글을 일일이 하나씩 들어가면서

댓글을 가지고 있나 찾아볼 수 없기 때문에

원본 데이터를 따로 하나 만들어준다.

 

이때 중복해서 원본데이터를 만들어 둘지 안 만들지는 설계자의 마음이다.

 

8번 게시글의 4번 댓글을 찾아갈 때는

/posts/8/comments/4 이렇게 찾아간다.

 

RestApi 주소 설계와 비슷하게 생겼다.

 

만약 /comments가 필요하다면 중복해서 원본 데이터를 만들어 둬야 한다.

 


 

RDB의 경우 복구 시스템이 매우 잘 만들어져 있다.

 

몽고 DB는 데이터를 막 집어넣기(INSERT) 때문에

 

데이터를 넣을 때 하나의 컬렉션에 1번 문서를 넣게 되면

똑같은 컬렉션 2개를 더 만들어서 똑같이 1번 문서를 집어넣는다.

 

이걸 레플리카셋이라고 한다.

 

데이터를 저장하는 db 서버 자체가 자기들끼리 서로 통신을 하고 있다.

 

첫 번째로 데이터가 들어오는 프라이머리 서버에 데이터가 들어오면

짧은 주기로 데이터가 들어오는지 감시하여

오 데이터 들어왔네? 동기화해버린다.

1번 서버를 프라이머리 서버, 나머지 서버를 세컨더리 서버라고 한다.

 

데이터가 몇 TB씩 들어오면 서버가 터져버린다.

프라이머리 서버가 터져버리면 2번이 프라이머리 서버가 되고,

1번은 자가적으로 2번 서버를 동기화하며 복구한다.

 


 

빅데이터는 매우 많은 양의 데이터가 필요한데

그 말은 즉 I/O가 매우 많이 일어난다.

I/O는 병렬 처리해주는 게 무조건 이득이다.

I/O 처리가 일어나는 동안 cpu가 놀고 있기 때문이다.

 

저장만 하는 프로세스에서 아무리 좋은 슈퍼컴퓨터 한 대로 데이터 1000개를 저장하는 것보다

구린 cpu더라도 컴퓨터가 많을수록 더 좋다.

 

이렇게 I/O를 분산처리하는 것을 샤딩이라고 한다.

 

여러 개의 컴퓨터가 데이터를 나눠서 저장하게 되면

1번 데이터 다음에 저장하는 데이터가 4번이 되어

PK가 붕 떠서 들어가기 때문에 auto_increament가 의미가 없어진다.

 

그렇기 때문에 몽고 DB는 PK에 해시값을 저장한다.

 

 


읽기보다 쓰기 작업이 많다면 인덱스를 포기하는 것이 좋다.
예쁘게 쌓인 인덱스가 계속해서 update 작업 때문에 바뀌게 되면 무용지물이기 때문이다.

몽고 DB는 기동시에 모든 데이터 파일을 메모리에 매핑하기 때문에 메모리를 엄청나게 많이 사용한다.

모든 도큐먼트 + 컬렉션 + 인덱스(_id)를 포함하는 데이터 파일을 페이지라고 부르고,
이는 4kb(영어로 4000자) 정도의 청크 단위로 램에 적재된다.

메모리에 다 올리지 못하면 페이지 폴트가 발생하기 때문에 디스크에 접근해야 한다.
메모리에 페이지 단위로 저장되기 때문에 페이지 폴트이다.

가상 메모리에 데이터를 저장하고 데이터 스와핑이 일어난다.

모든 데이터를 디스크에서 접근해야 한다면 성능이 엄청나게 저하되고 이것을 스래싱이라고 한다.

 

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형