-
[MongoDB] 컬렉션에서 컬럼 데이터를 삭제해도 공간이 반환되진 않는다는게 무슨 말일까?개발지식 아카이브/Database 2024. 12. 10. 16:19
MongoDB 컬렉션에서 컬럼(필드) 데이터를 삭제해도 공간이 반환되지 않는다는 것은 다음을 의미합니다:
MongoDB는 데이터를 저장할 때 document의 크기와 함께 파일 시스템의 물리적 공간을 할당합니다. 만약 특정 필드(컬럼)를 document에서 삭제하더라도, 해당 필드가 차지했던 공간이 자동으로 반환되거나 줄어들지 않습니다. 대신, 삭제된 필드의 공간은 내부적으로 채워지지 않은 빈 공간으로 남게 되고, 이후 document가 업데이트되거나 데이터가 추가될 때 재사용될 수 있습니다.
이 동작은 MongoDB의 WiredTiger 스토리지 엔진이 document 크기가 증가하거나 감소하는 경우 효율적인 관리를 위해 설계된 방식 때문입니다.
왜 공간이 반환되지 않을까?
1. 파일 단위의 저장 구조
MongoDB는 데이터를 BSON(Binary JSON) 형식으로 저장합니다. 한 번 파일에 기록된 document는 크기가 변하더라도 기존 파일 공간이 줄어들지 않습니다.
2. 프래그멘테이션(단편화)
필드를 삭제하거나 데이터를 업데이트하면 공간이 남는 단편화(Fragmentation)가 발생합니다. 이 공간은 새 데이터를 추가할 때 재활용되지만, 삭제 즉시 운영 체제에 반환되지는 않습니다.
3. 성능 최적화
데이터를 삭제할 때마다 공간을 반환하면 디스크 I/O 비용이 증가하고 성능 저하가 발생할 수 있습니다. MongoDB는 이러한 비용을 줄이고 업데이트 작업을 빠르게 하기 위해 공간을 유지합니다.
공간 반환을 위해 가능한 방법
만약 삭제한 필드로 인해 생긴 빈 공간을 실제로 반환하고 싶다면, 다음 방법을 사용할 수 있습니다:
1. `compact` 명령 사용
`compact` 명령은 데이터베이스의 단편화를 줄이고 사용되지 않는 공간을 재구성합니다.
```bash
db.runCommand({ compact: "컬렉션_이름" })
```
하지만 이는 실제 공간 반환보다는 MongoDB 내부적으로 데이터를 재정렬하여 효율성을 높이는 작업입니다.
2. 데이터를 새 컬렉션으로 마이그레이션
기존 컬렉션에서 데이터를 새 컬렉션으로 옮기면, 삭제된 필드로 인해 생긴 빈 공간이 제거됩니다.
```javascript
db.새컬렉션.insertMany(db.기존컬렉션.find())
db.기존컬렉션.drop()
```
3. 파일 크기 줄이기 (`repairDatabase`)
MongoDB의 `repairDatabase` 명령은 데이터베이스 전체를 정리하며, 불필요한 공간을 반환할 수 있습니다.
```bash
db.runCommand({ repairDatabase: 1 })
```
이 방법은 시간이 오래 걸릴 수 있으므로 주의가 필요합니다.
요약
MongoDB에서 필드를 삭제해도 디스크 공간은 자동으로 줄어들지 않고, 데이터 저장 파일 내에서 빈 공간으로 남습니다.이 공간은 이후 업데이트 시 재사용되지만, 디스크 사용량을 줄이려면 추가적인 작업이 필요합니다.
'개발지식 아카이브 > Database' 카테고리의 다른 글
[MySQL] DB 쿼리 검색결과를 CSV파일로 바로 추출하기 (0) 2019.06.15