# 1.5GB 데이터베이스를 99% 압축한 비법 – 초보자도 바로 적용 가능한 **데이터베이스 최적화** 실전 가이드

*링크: [Reddit 원문 보기](https://reddit.com/r/programming/comments/1puavnz/how_we_reduced_a_15gb_database_by_99/)*

---

# # 📌 서론 – “왜 내 DB가 이렇게 커졌을까?”

프로젝트를 진행하다 보면 **데이터베이스 용량이 급격히 커져** 서버 비용이 폭등하고, 쿼리 성능이 눈에 띄게 떨어지는 상황을 마주하게 됩니다. 특히 초보 개발자라면 “데이터가 많으니 당연히 큰 파일이 될 수밖에 없지?” 라는 생각에 빠지기 쉽죠. 하지만 실제로는 **불필요한 데이터와 비효율적인 설계**가 용량 급증의 주된 원인이라는 사실, 알고 계셨나요?

이번 글에서는 **1.5GB** 크기의 SQLite 파일을 **99%** 압축해 **15MB** 수준으로 만든 실전 사례를 바탕으로, **디스크 용량 절감**과 **SQL 튜닝**을 한 번에 잡을 수 있는 4가지 핵심 전략을 차근차근 설명합니다. 초보자도 바로 따라 할 수 있도록 명령어 예시와 체크리스트까지 제공하니, 지금 바로 적용해 보세요!

---

# # 🛠️ 본론

## # 1️⃣ 불필요한 컬럼·테이블 정리 – “정크 데이터”를 먼저 청소하라

| 문제점 | 해결 방법 |

|--------|-----------|

| 사용되지 않는 컬럼이 남아 있음 | `ALTER TABLE` 로 컬럼 삭제 (`DROP COLUMN`) |

| 오래된 로그 테이블이 누적 | 주기적인 `DELETE` 혹은 `TRUNCATE` 스크립트 자동화 |

| 중복 레코드 존재 | `SELECT DISTINCT` 로 중복 확인 후 `DELETE` |

**실전 예시**

```
sql

-- 사용되지 않는 컬럼 제거

ALTER TABLE users DROP COLUMN temp_flag;

-- 30일 이상 된 로그 삭제

DELETE FROM access_log WHERE created_at < DATE('now','-30 day');

```

> **TIP** : 삭제 후 반드시 `VACUUM;` 명령을 실행해 실제 파일 크기를 줄이세요. SQLite는 삭제된 레코드가 파일 안에 “빈 공간”으로 남아 있기 때문입니다.

---

## # 2️⃣ 데이터 타입 최적화 – “필요 이상 큰 타입은 NO!”

| 비효율적인 타입 | 권장 타입 |

|----------------|-----------|

| `INTEGER`(8바이트) → 실제 0~255 범위 | `SMALLINT`(2바이트) |

| `VARCHAR(255)` → 평균 5자 | `VARCHAR(10)` 혹은 `CHAR(5)` |

| `TEXT`(무제한) → 짧은 문자열 | `VARCHAR(20)` |

**예시**

```
sql

-- 기존 테이블 복제 후 타입 변경

CREATE TABLE users_new (

    id          INTEGER PRIMARY KEY,

    age         SMALLINT,

    username    VARCHAR(20) NOT NULL,

    email       VARCHAR(50)

);

INSERT INTO users_new SELECT id, age, username, email FROM users;

DROP TABLE users;

ALTER TABLE users_new RENAME TO users;

```

데이터 타입을 맞춤형으로 바꾸면 **스토리지 사용량이 평균 30~40%** 감소합니다.

---

## # 3️⃣ 인덱스 재검토 – “인덱스가 오히려 무게가 될 때”

인덱스는 검색 속도를 높여주지만, **불필요하게 많은 인덱스는 파일 크기를 크게** 만들고 삽입·수정 시 오버헤드를 유발합니다.

1. **사용 빈도가 낮은 인덱스 삭제**

   
```
sql

   DROP INDEX IF EXISTS idx_unused_column;

   
```

2. **복합 인덱스로 통합**

   
```
sql

   CREATE INDEX idx_user_email ON users (username, email);

   
```

3. **인덱스 크기 확인**

   
```
sql

   PRAGMA index_list('users');

   
```

인덱스를 정리한 뒤 `VACUUM;`을 다시 실행하면 **인덱스 파일 자체가 차지하던 공간까지 회수**됩니다.

---

## # 4️⃣ 압축 및 파티셔닝 – “데이터를 나눠서 저장하면 효율 UP”

### # a. 파일 압축 (SQLite 전용)

SQLite는 자체적으로 **`PRAGMA page_size`** 를 4096 바이트 이하로 낮추면 페이지당 저장 효율이 증가합니다.

```
sql

PRAGMA page_size = 1024;

VACUUM;

```

### # b. 파티셔닝 (대용량 테이블에 적용)

예를 들어 **로그 테이블**을 연도·월 별로 분리하면, 매월 필요한 파티션만 로드해 **I/O 비용을 크게 절감**할 수 있습니다.

```
sql

-- 2024년 01월 로그 파티션 생성

CREATE TABLE log_202401 AS SELECT * FROM logs WHERE strftime('%Y-%m', created_at) = '2024-01';

```

파티션을 활용하면 **전체 DB 파일 크기는 유지하면서** 실제 사용되는 데이터만 빠르게 접근할 수 있습니다.

---

# # 📈 결론 – 지금 바로 “데이터베이스 최적화” 실천하기

1. **불필요한 컬럼·테이블**을 정리하고 `VACUUM`으로 빈 공간을 회수한다.

2. **데이터 타입**을 실제 범위에 맞게 축소한다.

3. **인덱스**를 재검토해 최소화하고, 복합 인덱스로 통합한다.

4. **페이지 사이즈 조정·파티셔닝**으로 물리적 파일 크기를 최적화한다.

이 네 가지만 적용해도 **1.5GB → 15MB** 수준의 압축 효과를 기대할 수 있습니다. 초보자도 **SQL 명령어**와 **간단한 체크리스트**만 따라 하면 충분히 가능한 일!

> **행동 유도** – 지금 사용 중인 데이터베이스 파일을 백업한 뒤, 위 체크리스트를 하나씩 실행해 보세요. 30분 안에 눈에 띄는 디스크 용량 절감과 쿼리 속도 향상을 직접 체감하실 수 있을 겁니다.

---

## # 📚 주요 SEO 키워드

- **데이터베이스 최적화**

- **디스크 용량 절감**

- **SQL 튜닝**

---

*이 글이 도움이 되었다면, 댓글로 여러분의 최적화 경험을 공유하거나 SNS에 공유해 주세요! 🚀*
