What is MongoDB?
장점
1. 정규화를 통해서 데이터 중복을 방지할 수 있다.
2. Join의 성능이 좋다.
3. 복잡하고 다양한 쿼리가 가능하다.
4. 잘못된 입력을 방지할 수 있다.
5. 스케일 업 방식에 유리하다.
단점
1. 하나의 레코드를 확인하기 위해서 여러 테이블을 Join하여 가시성이 떨어진다.
2. 스키마가 엄격해서 변경에 대한 공수가 크다.
장점
1. 데이터 접근성과 가시성이 좋다.
2. Join 없이 조회가 가능해서 응답 속도가 일반적으로 빠르다.
3. 스키마 변경에 공수가 적다.
4. 스키마가 유연해서 데이터 모델을 App의 요구사항에 맞게 데이터를 수용할 수 있다.
5. 스케일 아웃에 유용하다.
단점
1. 데이터의 중복이 발생한다.
2. 스키마가 자유롭지만 스키마 설계를 잘해야 성능 저하를 피할 수 있다.
show dbs를 보면 기본 database를 살펴볼 수 있다.
Collection 특징
1. 동적 스키마를 갖고 있어서 스키마를 수정하려면 필드 값을 추가/삭제/ 수정하면 된다.
2. 컬렉션 단위로 Index를 생성할 수 있다.
3. 컬렉션 단위로 Shard를 나눌 수 있다.
test> show dbs
admin 40.00 KiB
config 60.00 KiB
local 72.00 KiB
test> use testing
switched to db testing
testing> show collections
testing> db.message.insertOne({
... user:"geon",
... age:"27",
... log:"Hello World"
... })
{
acknowledged: true,
insertedId: ObjectId("64d228046ebbb0f97e2d595c")
}
testing> db.message.insertOne({
... name:"java",
... age:27,
... log: "Hello java",
... date: "2022-09-22"
... })
{
acknowledged: true,
insertedId: ObjectId("64d229d26ebbb0f97e2d595d")
}
testing> db.message.find()
[
{
_id: ObjectId("64d228046ebbb0f97e2d595c"),
user: 'geon',
age: '27',
log: 'Hello World'
},
{
_id: ObjectId("64d229d26ebbb0f97e2d595d"),
name: 'java',
age: 27,
log: 'Hello java',
date: '2022-09-22'
}
]
testing>
데이터 형식
- 데이터를 보면 json 형식으로 표현을 합니다. 하지만 저장을 할 때에는 json 형식으로 저장하지 않고 bson으로 저장을 합니다.
BSON
- Binary JSON의 JSON을 바이트 문자로 표현하는 경량 바이너리 형식이다. TEXT 형식인 JSON을 바이너리로 저장하면 빠르게 저장 및 접근이 가능하고 다양한 형식으로 저장할 수 있다.
스토리지 엔진
- 데이터가 메모리와 디스크에 어떻게 저장하고 읽을지 관리하는 컴포넌트이며
- MySQL과 동일하게 플러그인 형태로 되어져 있어 다양한 스토리지 엔진을 사용할 수 있다.
- 3.2 부터 기존의 MMAPv1에서 -> WiredTiger로 변경되어 성능이 큰 폭으로 향상이 되었습니다.
다양한 변화가 있었지만 대표적으로 2가지 관점에서 살펴보면 데이터 압축, Lock 부분이 수정이 되었습니다.
기존의 MMAPv1은 데이터 압축을 지원히지 않고 Lock은 버전에 따라 데이터베이스, Collection 레벨에 Lock을 지원을 하였습니다.
WiredTiger는 데이터 압축을 지원하고 Document 레벨의 락을 지원을 합니다.
일단 링크에 들어가서 Atlas에 로그인을 합니다. 이후 Build Database를 선택을 합니다.
이후 db를 선택을 합니다. 요청 수, 시간 당 요금을 부과하는 서버리스, Dedicated 보다는 저는 무료버전을 선택을 하겠습니다.
이후 나라를 Seoul로 선택을 하고 DB를 생성을 합니다.
이후 Connection을 선택하고 연결을 선택을 합니다. 보통 Shell , 화면으로 쉽게 데이터를 볼 수 있는 Compass를 제일 많이 사용을 합니다.
$ docker -v
$ docker pull mongo
$ docker run --name mongodb-container -v ~/data:/data/db -d -p 27017:27017 mongo
$ docker exec -it mongodb-container bash
root@073c229db4e5:/# mongosh
유튜브에 MongoDB와 MySQL의 성능을 비교하는 영상이 있어서 비교적 쉽게 차이를 학습할 수 있었습니다.
MongoDB 버전 3.2부터 WiredTiger가 디폴트 엔진으로 사용되며 성능이 크게 향상이 되었습니다.
모든 컬렉션 및 인덱스에 대한 압축을 제공하여 성능이 향상이 되었습니다. (Snappy 블록 압축 알고리즘)
BSON 파일은 JSON 형식의 파일처럼 보이지만 디스크 사용량을 줄이기 위해 직렬화되어 바이너리 파일로 저장을 합니다.
write 성능도 살펴보면 MongoDB가 특정 데이터의 범위를 넘어가면 성능이 더 좋은 모습을 살펴볼 수 있습니다.
이후 UPDATE 빼고 DELETE도 MongoDB가 더 빠르다고 알 수 있습니다.
일반적으로 MongoDB가 MySQL보다 더 빠르고 더 많은 CPU를 사용한다고 알 수 있습니다.
그러면 왜 일반적으로 속도가 빠른 MongoDB를 사용하지 않고 MySQL (RDB)를 사용을 하나요?
https://www.youtube.com/watch?v=3axR2Onz1nU
https://poiemaweb.com/mongdb-basics
https://www.geeksforgeeks.org/difference-between-sql-and-nosql/