cleanUrl: /posts/mongodb-vs-mysql-rdbms-and-cursor/

부제: MongoDB vs RDBMS(MySQL), cursor

https://blog.yevgnenll.me/media/mongodb-vs-mysql.png

MySQL 과 같은 RDB에 익숙했지만 좌표를 저장하고 다뤄야 한다는 spatial 프로젝트를 경험하고, 기술조사를 하면서 MongoDB 의 매력에 대해 알게 되었다.

schma-free 라는 특징이 가장 인상적이었는데 몇몇 프로젝트는 이미 데이터가 900만건 이상 저장되어있고, 실시간으로 운영되고 있음에도 불구하고, column 추가의 필요성이 있어 alter table 을 실행하곤 하였다.

다행히 alter table 이후 장애는 없었지만, 과연 live 인 RDB에 이러한 행동을 하는건 올바른가? 라는 질문을 수도없이 해왔다. 이 환경에 대응할 수 없는 회사의 상황, 환경 이건 어딜 가나 맞찬가지라고 생각했다. 데이터가 실시간으로 쌓이고 있는데 그걸 어떻게 백업하고, 누락된 데이터에 대한 전처리 후처리는 어떻게 할 것인가?

이런 고민을 한번에 해결할 수 있었던 것이 MongoDB 였다. column이 아닌 field 였고, table 이 아닌 document json 이기 때문에 내 domain 에 field 를 하나 추가하면 된다. 지금 운영중인 DB 에 문서마다 field 의 차이가 있다.

비교

Untitled Database

Cursor

MongoDB 는 cursor 를 반환하는데 커서를 통해 반복적으로 실제 document 를 가져올 수 있다. 이렇게 하는 이유는 결과를 client server memory 에 모두 담아두지 않아도 처리할 수 있게 하기 위해서이다.

물론 cursor 를 읽을 때 마다 서버에서 바로 document를 가져오는것은 아니다.

문서의 정의를 보면

A pointer to the result set of a query. Clients can iterate through a cursor to retrieve results. By default, cursors timeout after 10 minutes of inactivity. See Iterate a Cursor in the mongo Shell.

query 결과 set의 pointer 라고 한다. 마치 symbolic 와 같다. (C, C++을 공부했다면 무슨느낌인지 확 올듯)

즉 쿼리 결과 자체를 주면 메모리를 먹을테니 그 주소값을 주고, 필요할때 주소에 접근하여 query 의 result 를 확인하도록 하는것이다.

MongoDB 의 특징으로 다음을 언급한다.

  1. NoSQL
  2. Schema-free
  3. 비 관계형 DB