Database

[MySQL] OPTIMIZE - 테이블 최적화

비번변경 2025. 5. 30. 15:54

개요

AWS RDS 사용 중 총 100GB의 스토리지 용량 중 95GB를 사용하고 있다는 알람을 받았다.

문제를 해결하기 위해 데이터베이스 테이블에서 데이터를 삭제했는데 스토리지 용량을 줄어들지 않는 상태다.

이번 글은 이 문제를 해결하는 방법 중 하나인 OPTIMIZE TABLE 구문에 대해서 정리한다.

 

 

원인

데이터베이스는 데이터를 삭제하면 실제로 데이터를 삭제하는 것이 아니라 삭제 표시만 한 후 다른 데이터가 오면 그 위에 덮어쓰는 방식으로 동작한다.

좀 더 간결하게 표현하면 데이터를 삭제해도 해당 공간을 바로 회수하지 않는다. 이후에 데이터를 삽입할 떼 보다 빠른 성능을 위해 할당한 공간을 재사용하기 위함인데, 용량 확보 필요시 OPTIMIZE TABLE 구문으로 삭제한 공간을 실제 디스크 공간으로 회수할 수 있다.

 

 

OPTIMIZE

OPTIMIZE TABLE 구문은 테이블 데이터와 인덱스 데이터의 물리적 저장소를 재구성하여 저장 공간을 줄이고, 테이블 접근 시의 I/O 효율을 향상한다. 주로 잦은 데이터 삭제 및 갱신으로 인한 디스크 공간 단편화를 줄이기 위해 사용한다. 주로 디스크 조각 모음에 많이 비유한다.

OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...

OPTIMIZE TABLE 구문은 보통 데이터 파일의 크기가 지나치게 커지거나 테이블 성능이 저하되었을 때 사용하며, 스토리지 엔진에 따라 테이블에 적용되는 내용이 다를 수 있다. 참고로 InnoDB, MyISAM, ARCHIVE 테이블에서 동작한다.

 

OPTIMIZE TABLE 구문은 테이블에 대한 SELECT 및 INSERT 권한을 필요로 하고, 수행 시 대상 테이블과 동일한 임시 테이블을 생성하기 때문에 추가적인 용량을 필요로 할 수 있다.

또한 InnoDB 테이블의 경우에는 OPTIMIZE TABLE 수행 시 테이블이 잠길 수 있기 때문에 성능에 영향을 줄 수 있다.

 

 

사용 예시

기본적으로 대상 테이블을 지정하여 사용할 수 있으며, 필요시 여러 테이블을 지정하여 최적화할 수 있다.

OPTIMIZE TABLE employees

OPTIMIZE TABLE employees, departments;

 

 

 

 

참고 문서

https://dev.mysql.com/doc/refman/8.4/en/optimize-table.html

https://monkeybusiness.tistory.com/806

 

728x90