프로그래밍

in-memory DB는 왜 더 빠를까

2kindsofcs 2020. 4. 26. 17:03

in-memory DB는 disk-based DB와 달리 말 그대로 메모리에 데이터를 저장한다.

외부 저장 장치에 데이터를 저장하지 않고 메모리에서 데이터를 읽고 쓴다.

메모리 <-> 디스크 간 병목이 없기 때문에 disk-based DB보다 훨씬 속도가 빠르다. 

 

외부 저장 장치에 데이터를 저장하여 사용할 경우에는 왜 느린가?

외부 저장 장치에 있는 데이터를 읽고자 할 경우, 해당 데이터를 곧바로 사용할 수 없다.

데이터를 읽어서 메모리에 올리고, 메모리에 올라간 데이터를 읽어서 사용할 수 있다.

 

 

 

 

https://ko.wikipedia.org/wiki/메모리_계층_구조

 

(약간 옆으로 새는 이야기라서 회색 처리)

만약 HDD를 외부 저장 장치로 사용한다면 액츄에이터가 액츄에이터 암을 움직이고, 

액츄에이터 암의 끝에 달려 있는 헤드를 통해 데이터를 읽고 쓰게 된다.

in-memory DB에는 이런 과정이 필요가 없다. 

 

좀 더 구체적인 예시를 들어 보자.

disk-based DB는 데이터를 페이지(블록)단위로 읽어온다.

내가 원하는 데이터가 지금 메모리에 있는 페이지(블록)에 없다면?

그러면 또 디스크에서 다른 페이지(블록)을 읽어야 한다. 이 과정에서 지연이 발생한다. 

in-memroy DB는 애초에 메모리에 모든 데이터가 있기 때문에 지연이 적다.  

 

그러면 무조건 disk-based DB보다 in-memory DB가 더 좋을까? 

상황에 따라 다르다.

in-memory DB는 기본적으로 영속성(persistence)을 보장하지 않는다. 

에러가 나서 갑자기 프로세스가 종료된다거나 하면, 데이터가 모두 유실될 수도 있다. 

 

또, in-memory DB는 메모리에 데이터를 저장하기 때문에 저장 공간이 한정되어있다.

한계에 도달하면 기존 데이터를 지우든가 아니면 새로운 데이터를 입력하지 못할 것이다. 

 

하지만 반드시 영속성이 필요하지 않고, 저장 공간이 많이 필요한 것도 아니라면 in-memory DB는 매우 유용하다.

예를 들어, 테스트에 db가 필요하다면 in-memory DB가 좋은 선택일 수 있다.

테스트를 빠르게 실행한다면 업무 효율에도 좋고,

설령 중간에 문제가 생겨서 데이터가 없어져도 테스트용 데이터이기 때문에 실 서비스에 아무런 영향이 없다.

대표적인 예시로 시퀄라이트(SQLite)가 있다. 


한편, in-memory DB는 NoSQL과 동의어가 아니다. 

메모리에 데이터를 읽고 쓰는 DB면 in-memory DB이다. 

대표적인 RDBMS인 MySQL도 in-memory 모드를 지원한다. 

유명한 NoSQL인 redis가 in-memory DB여서 마치 이 둘을 동의어처럼 쓰는 사람들이 있는 것 같다. 

반응형