ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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에서 필드를 삭제해도 디스크 공간은 자동으로 줄어들지 않고, 데이터 저장 파일 내에서 빈 공간으로 남습니다.

    이 공간은 이후 업데이트 시 재사용되지만, 디스크 사용량을 줄이려면 추가적인 작업이 필요합니다.

    댓글

Copyright in 2020 (And Beyond)