MySQL 서버에는 전통적으로 테이블별로 전용 테이블 스페이스를 사용했었다.
InnoDB 스토리지 엔진의 시스템 테이블 스페이스만 제너럴 테이블스페이스를 사용했는데, 제너럴 테이블스페이스는 여러 테이블의 데이터를 한꺼번에 저장하는 테이블스페이스를 의미한다.
MySQL 8.0 버전이 되면서 사용자 테이블을 제너럴 테이블스페이스로 저장하는 기능이 추가되고 테이블스페이스를 관리하는 DDL 명령이 추가됐다.
제약 사항
MySQL 8.0에서도 제너럴 테이블스페이스는 여러가지 제약 사항을 가진다.
- 파티션 테이블은 제너럴 테이블 스페이스를 사용하지 못함
- 복제 소스와 레플리카 서버가 동일 호스트에서 실행되는 경우
ADD DATAFILE
문장은 사용 불가 - 테이블 암호화는 테이블스페이스 단위로 설정됨
- 테이블 압축 가능 여부는 테이블스페이스의 블록 사이즈와 InnoDB 페이지 사이즈에 의해 결정됨
- 특정 테이블을 삭제(
DROP TABLE
)해도 디스크 공간이 운영체제로 반납되지 않음
장점
그럼에도 불구하고 사용자 테이블이 제너럴 테이블 스페이스를 이용할 수 있게 개선된 것은 다음과 같은 장점이 있기 때문이다.
- 제너럴 테이블스페이스를 사용하면 파일 핸들러(Open file descriptor)를 최소화
- 테이블스페이스 관리에 필요한 메모리 공간 최소화
위 장점은 테이블의 개수가 매우 많은 경우에 유용하며, 일반적인 환경에서 제너럴 테이블 스페이스의 장점을 취하기가 어렵다.
사용
MySQL 서버에서 테이블이 어떤 테이블스페이스를 사용할지는 innodb_file_per_table
시스템 변수로 제어할 수 있다.
MySQL 8.0에서는 해당 시스템 변수 기본값이 ON이므로 테이블은 자동으로 개별 테이블스페이스를 사용한다.
데이터베이스에 작은 테이블이 매우 많이 필요한 응용 프로그램을 개발 중이라면 제너럴 테이블 스페이스에 대한 활용을 고려해보는 것도 좋은 방법이다.