삭제 목적에 따라 delete / truncate / drop / partition drop 중 어떤 걸 쓰는지가 달라지는 거라서 정리
✅ 1. DELETE는 왜 쓰는가?
✔ DELETE = 데이터만 지움 (파일 공간은 남김)
- DELETE 는 레코드를 하나씩 지우는 명령
- InnoDB 는 “undo/redo 로그”, “transaction log” 를 유지해야 해서
파일을 바로 줄일 수 없음 → 대신 “빈 공간으로 표시”만 함.
- 즉, DELETE는 공간을 회수하는 게 목적이 아니라 ‘레코드 단위 삭제’가 목적.
🔹 DELETE가 쓰이는 이유
- 조건부 삭제가 가능
- DELETE FROM orders WHERE status = 'CANCEL';
- “업무 로직상 필요한 삭제” (특정 고객 데이터 제거 등)
- 외래키 제약 때문에 TRUNCATE 불가한 경우
- 삭제 작업이 트랜잭션 로그를 남기기 때문에 “실수시 ROLLBACK 가능”
👉 DELETE = 안전하고 세밀한 삭제
✅ 2. TRUNCATE는 왜 쓰는가?
✔ TRUNCATE = 테이블 전체를 빠르게 비움 + 공간 회수
- 테이블을 초기화하는 DDL(Drop → Create) 이랑 거의 동일
- Undo/Redo 로그도 거의 안 남아서 매우 빠르게 동작.
- AUTO_INCREMENT 값도 초기화됨.
- 외래키가 걸려 있으면 실행 불가.
🔹 TRUNCATE 특징
- 파일 크기를 대부분 회수함 (특히 File-Per-Table 모드)
- 개별 레코드 삭제가 아니라 테이블 자체를 재생성하는 방식
- ROLLBACK 불가능 → 위험함
👉 TRUNCATE = 전체 삭제 + 파일 크기 정리 + 빠름
✅ 3. DELETE vs TRUNCATE 핵심 비교
| 항목 |
DELETE |
TRUNCATE |
| 삭제 단위 |
레코드 단위 |
전체 테이블 |
| 속도 |
느림 |
매우 빠름 |
| 트랜잭션 |
지원 (rollback 가능) |
비지원 |
| 로그 |
row 단위 기록 |
최소 기록 |
| 파일 공간 회수 |
❌ 회수 안 됨 |
⭕ 회수됨 |
| AUTO_INCREMENT |
유지 |
초기화 |
✅ 4. “파일 크기 회수”가 목적이면 DELETE는 맞는 선택이 아님
🔹 DELETE는 “논리 삭제/데이터 삭제” 목적
파일은 그대로 남는 게 정상
🔹 디스크 공간 회수가 목적이면 아래 택해야 함
- TRUNCATE TABLE
- OPTIMIZE TABLE (테이블 재구조화 + 파일 압축)
- DROP + CREATE
- 파티션 드롭→ 이건 파일 자체가 즉시 삭제됨
→ 대용량 테이블에서는 최강 옵션
- ALTER TABLE logs DROP PARTITION p20240101;
✅ 5. 결론
✔ DELETE가 쓸모 없다는 뜻이 아니다
- 데이터 삭제 목적에는 완벽함
- 다만 파일 크기를 줄이지는 않을 뿐
✔ 파일 크기를 줄이려면
- TRUNCATE
- OPTIMIZE TABLE
- 파티션 DROP
- 테이블 DROP 후 재생성
✔ 파티션을 쓰는 이유
- 바로 이 **“파티션별 DROP 시 파일 공간 즉시 회수”**가 최강 장점
→ delete 수백만 건보다 ALTER TABLE DROP PARTITION 0.1초짜리가 훨씬 좋음
