지난 번에 알아본 Internal Temporary Table에서 소개한 MySQL 8.0부터 추가된 TempTable 스토리지 엔진에 대하여 알아보자(https://jongguheo.blogspot.com/2020/11/internal-temporary-table.html)
TempTable storage engine
MySQL 8.0은 기본 값으로 인메모리 임시 테이블과 디스크 임시 테이블이 TempTable로 되어있다.
TempTable 스토리지 엔진은 아래와 같은 특징이 있다
- 가변 길이 데이터 타입의 효율적인 스토리지 제공
- 바이너리 오브젝트 타입 서포트
- 글로벌 메모리 영역에서의 관리
- mmap 파일에 의한 overflow
가변 길이 데이터 타입의 효율적인 스토리지 제공
종래의 인메모리 임시 테이블은 VARCHAR, VARBINARY 같은 가변 길이 데이터 타입에 대해서도, Column에 지정된 문자 수를 격납하므로 스토리지를 과소비 하는 문제가 있었다.
종래의 인메모리 임시 테이블은 VARCHAR, VARBINARY 같은 가변 길이 데이터 타입에 대해서도, Column에 지정된 문자 수를 격납하므로 스토리지를 과소비 하는 문제가 있었다.
예) "name varchar(20)” 컬럼에 "jonggu"가 저장되어 있으면 실제 데이터는 6바이트, 인모메리 임시 테이블에서는 실제 데이터 크기가 아닌 20바이트를 사용한다
8.0부터 추가된 TempTable에서는 가변 길이 데이터 타입도 실제 데이터 크기만 소비하도록 개선되었다.
바이너리 오브젝트 타입 서포트
종래의 인메모리 임시 테이블은 BLOB, TEXT, JSON 같은 타입을 서포트 하지 않았으므로, 이러한 타입이 있는 경우는 디스크 임시 테이블을 사용하도록 되어 있었다.
TempTable에서는 이 타입들 또한 서포트 되어, 인메모리 임시 테이블에서 처리할 수 있게 되었다.
글로벌 메모리 영역에서의 관리
종래의 인메모리 임시 테이블은 스레드 별로 메모리 최대 값을 설정하고, 스레드 별로 메모리를 확보하고 있었다.
TempTable에서는 스토리지 엔진이 점유하는 메모리 최대 값을 설정할 수 있게 되었고, 모든 스레드가 공유하여 사용한다.
최대 값은 temptable_max_ram으로 설정가능하고 기본 값은 1GB이다.
mmap 파일에 의한 overflow
종래의 인메모리 임시 테이블은 디스크 임시 테이블로 전환될 때, 인메모리 임시 테이블의 데이터를 디스크 임시 테이블로 복사하는 처리가 발생하고 있었다.
temptable_use_mmap=ON인 경우, TempTable 스토리지 엔진이 mmap 임시 파일로 인메모리 임시 테이블을 위한 공간을 할당하기 때문에 데이터를 복사하는 처리는 발생하지 않는다.
설정에 대하여
MySQL 8.0에서는 내부 임시 테이블의 종류가 3가지 있는 데, 그 중에서 어떤 설정이 좋을 지 생각해보자.
8.0부터 추가된 TempTable에서는 가변 길이 데이터 타입도 실제 데이터 크기만 소비하도록 개선되었다.
바이너리 오브젝트 타입 서포트
종래의 인메모리 임시 테이블은 BLOB, TEXT, JSON 같은 타입을 서포트 하지 않았으므로, 이러한 타입이 있는 경우는 디스크 임시 테이블을 사용하도록 되어 있었다.
TempTable에서는 이 타입들 또한 서포트 되어, 인메모리 임시 테이블에서 처리할 수 있게 되었다.
글로벌 메모리 영역에서의 관리
종래의 인메모리 임시 테이블은 스레드 별로 메모리 최대 값을 설정하고, 스레드 별로 메모리를 확보하고 있었다.
TempTable에서는 스토리지 엔진이 점유하는 메모리 최대 값을 설정할 수 있게 되었고, 모든 스레드가 공유하여 사용한다.
최대 값은 temptable_max_ram으로 설정가능하고 기본 값은 1GB이다.
mmap 파일에 의한 overflow
종래의 인메모리 임시 테이블은 디스크 임시 테이블로 전환될 때, 인메모리 임시 테이블의 데이터를 디스크 임시 테이블로 복사하는 처리가 발생하고 있었다.
temptable_use_mmap=ON인 경우, TempTable 스토리지 엔진이 mmap 임시 파일로 인메모리 임시 테이블을 위한 공간을 할당하기 때문에 데이터를 복사하는 처리는 발생하지 않는다.
설정에 대하여
MySQL 8.0에서는 내부 임시 테이블의 종류가 3가지 있는 데, 그 중에서 어떤 설정이 좋을 지 생각해보자.
- In-Memory temporary table: TempTable, Disk Temporary table: TempTable(Default)
- In-Memory temporary table: TempTable, Disk Temporary table: InnoDB
- In-Memory temporary table: Memory, Disk Temporary table: InnoDB
필자의 개인적인 의견으로는, Default가 좋은 거 같다.
몇가지 테스트를 해본 결과 대부분의 내부 임시 테이블을 사용하는 쿼리는, 종래의 구조보다 TempTable을 사용하는 게 퍼포먼스가 좋았다.
몇가지 테스트를 해본 결과 대부분의 내부 임시 테이블을 사용하는 쿼리는, 종래의 구조보다 TempTable을 사용하는 게 퍼포먼스가 좋았다.
하지만 MySQL 8.0 조기 버전에서는, 꽤 많은 버그 리포트가 있었고
이 버그들은 MySQL 8.0.21 에서 개수된게 많이 때문에, 8.0.20 이하인 경우는 안전성을 생각하여 종래의 구조를 선택하는 게 좋을 거 같다.
이 버그들은 MySQL 8.0.21 에서 개수된게 많이 때문에, 8.0.20 이하인 경우는 안전성을 생각하여 종래의 구조를 선택하는 게 좋을 거 같다.
또한, 2. 에 대하여 설정을 고려하는 경우도 알아보자.
temptable_max_ram 파라미터를 초과하면 mmap 임시 파일을 작성하는 데, 사이즈가 큰 내부 임시 테이블을 작성하는 쿼리가 있으면, 대량의 메모리를 소비할 가능성이 있다.
내부 임시 테이블을 작성하는 쿼리가 많고, 메모리 사용량에 문제가 되는 경우는 2. 를 사용할 거 같다
댓글 없음:
댓글 쓰기