1.5GB 데이터베이스를 99% 압축한 비법 – 초보자도 바로 적용 가능한 **데이터베이스 최적화** 실전 가이드
링크: Reddit 원문 보기
# 📌 서론 – “왜 내 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️⃣ 인덱스 재검토 – “인덱스가 오히려 무게가 될 때”
인덱스는 검색 속도를 높여주지만, 불필요하게 많은 인덱스는 파일 크기를 크게 만들고 삽입·수정 시 오버헤드를 유발합니다.
- 사용 빈도가 낮은 인덱스 삭제
sql
DROP INDEX IF EXISTS idx_unused_column;
- 복합 인덱스로 통합
sql
CREATE INDEX idx_user_email ON users (username, email);
- 인덱스 크기 확인
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 파일 크기는 유지하면서 실제 사용되는 데이터만 빠르게 접근할 수 있습니다.
# 📈 결론 – 지금 바로 “데이터베이스 최적화” 실천하기
불필요한 컬럼·테이블을 정리하고
VACUUM으로 빈 공간을 회수한다.데이터 타입을 실제 범위에 맞게 축소한다.
인덱스를 재검토해 최소화하고, 복합 인덱스로 통합한다.
페이지 사이즈 조정·파티셔닝으로 물리적 파일 크기를 최적화한다.
이 네 가지만 적용해도 1.5GB → 15MB 수준의 압축 효과를 기대할 수 있습니다. 초보자도 SQL 명령어와 간단한 체크리스트만 따라 하면 충분히 가능한 일!
행동 유도 – 지금 사용 중인 데이터베이스 파일을 백업한 뒤, 위 체크리스트를 하나씩 실행해 보세요. 30분 안에 눈에 띄는 디스크 용량 절감과 쿼리 속도 향상을 직접 체감하실 수 있을 겁니다.
# 📚 주요 SEO 키워드
데이터베이스 최적화
디스크 용량 절감
SQL 튜닝
이 글이 도움이 되었다면, 댓글로 여러분의 최적화 경험을 공유하거나 SNS에 공유해 주세요! 🚀