본문 바로가기

데이터베이스

NoSQL의 종류와 특징.

전통적인 RDBMS 보다 성능이 좋거나, 가용성이 높거나 하는 한가지 특별한 목적에서는 RDBMS를 많이 넘어서고, 그로 인한 기능 제약은 받아들이는 데이터 스토어 소프트웨어를 통칭해서 NoSQL 이라고 부릅니다.

 

따라서, 수많은 종류가 사용되고 있을 수도 있지만, 산업계에서 많이 쓰이는 4가지 종류가 있습니다.

 

Column based NoSQL

구글의 빅테이블이 대표적.

보통 DBMS에서는 데이터를 row 단위로 저장하잖아요? 대부분의 No-SQL역시 마찬가지입니다.

그런데 구글에서 빅데이터 분석을 위해 새로 이런 개념을 만들어냈습니다. 데이터 저장를 column 단위로 저장하는 개념을 만든 거죠. 특정 컬럼만 액세스할 때는 1 / 컬럼 갯수만큼만 I/O가 발생하기 때문에 속도가 매우 빠릅니다. 반면 select * from ... 이런 쿼리는 최악이겠죠?

 

key-value NoSQL

redis, memcached 가 속함.

Dictionary 데이터 구조처럼, key 를 기준으로 뭔가를 저장합니다. 대부분 인덱스를 지원하지 않아서 key 값으로만 데이터를 가져올 수 있습니다. WHERE 조건에 pk 만 들어갈 수 있어요. 제약이 많은 대신, 분산 시스템 구축이 쉽습니다. key 를 기준으로 어디에 저장되어 있는지 확인해서 그 데이터를 저장하고 있는 서버에서 데이터를 가져올 수 있습니다.

 

document based NoSQL

mongoDB 가 이 안에 속함.

key-value NoSQL 을 기본으로, 비정형 데이터에 대한 기능성을 추가한 것입니다.

저장을 JSON이나 XML 로 할 수 있고요, 특정 필드에 인덱스를 걸 수도 있습니다. 하지만 인덱스도 제약이 있으니 조심해야 합니다.

mongoDB를 확인해보니, where 문 아래에 조건을 여러개 거는 경우, 순서대로 인덱스가 작성되어야 합니다. 쿼리 조건이 단순해야 유용하겠습니다. mongoDB의 경우에도 explain 기능을 잘 사용해서 인덱스를 사용하고 있나 점검이 필요합니다.

 

graph DB

facebook 처럼 social 관계를 처리하는 곳에서는 특정 노드와 노드 사이가 연결된 그래프 형태의 데이터 구조를 빠르게 액세스할 수 있는 DBMS가 필요했고, 그 때문에 만든 것입니다.

 

 

NoSQL이 RDBMS보다 성능이 좋은가요?

 

분산 환경이 구축된 경우에는 무조건 빠릅니다. 애초에 속도 때문에 scale-up 만 가능한 RDBMS를 탈피한 것이 NoSQL이니만큼, 분산환경을 기본으로 만들어진 소프트웨어들입니다. 그 때문에 join 도 안되고, transaction 처리도 안되는 제약 조건을 감수한 것이죠.

write 를 100만개 실행하면, 그것을 서버 10대에 나눠서 10만개씩 저장하니 속도가 빠를 수 밖에 없습니다.

 

분산 환경이 아니더라도, 저장 및 조회가 빠릅니다. index 를 사용하는 것은 RDBMS에 비해 극히 제한적입니다만..

RDBMS는 PK 역시 보통 btree 로 저장하는 반면, key-value NoSQL은 hash(dictionary) 로 저장합니다. 데이터 구조중 tree 와 dictionary 를 아실텐데요, tree 는 검색과 저장에 O(log n) 이 걸립니다. dictionary 의 경우 검색과 저장에 O(1) 이 걸립니다. pk 로만 저장, 검색하는 경우에는 No-SQL이 single instance 로도 더 빠를 수 밖에 없는 구조네요. RDBMS는 O(log n)을 지불하는 대신, range 검색과 정렬을 얻었습니다. 네..No-SQL은 pk(key)로도 range 검색과 정렬이 안됩니다

 

NoSQL을 실제 적용하고 싶다면?

 

비즈니스 요건이 어떻게 바뀔지 예상할 수 없으므로, 처음에 시작할 때는 일단 SQL로 하는 것이 좋습니다. 그 후, 트랜잭션이 폭증하면 데이터 중에서 임팩트가 크고, 데이터 액세스 패턴이 단순한 것들을 NoSQL로 이동시키는 거죠.

 

저도 예전에 게임 만들때 한 때 NoSQL이 좋아보여서 카산드라로 구축했다가, 개발하다 보니 결국 두 테이블을 조인하지 않을 수 없는 상황이 생겼는데, 방법이 없어서 다시 mysql 로 옮겨간 시행착오의 경험이 있습니다.