CREATE TEMPORARY TABLE
명령으로 만든 임시 테이블과는 다름VARBINARY
나 VARCHAR
같은 가변 길이 타입을 지원하지 못해 메모리 낭비 문제를 갖고 있었다.internal_tmp_mem_storage_engine
시스템 변수로 메모리용 임시 테이블을 MEMORY와 TempTable 중 선택할 수 있다. (기본값은 TempTable)temptable_max_ram
시스템 변수로 메모리 공간 크기를 제안할 수 있다. (기본값 1GB)temptable_use_mmap
시스템 변수의 기본값이 ON
이라서 기본적으로 임시 테이블은 MMAP 파일로 디스크에 기록된다.internal_tmp_disk_storage_engine
시스템 변수에 설정되어 있는 엔진을 사용한다. (기본값 InnoDB)ORDER BY
와 GROUP BY
에 명시된 칼럼이 다른 쿼리ORDERY BY
나 GROUP BY
에 명시된 칼럼이 조인의 순서상 첫 번째 테이블이 아닌 쿼리DISTINCT
나 ORDER BY
가 동시에 쿼리에 존재하는 경우 또는 DISTINCT
가 인덱스로 처리되지 못하는 쿼리UNION
이나 UNION DISTINCT
가 사용된 쿼리(select_type
칼럼이 UNION RESULT
인 경우)select_type
이 DERIVED
인 쿼리UNION
이나 UNION ALL
에서 SELECT
되는 칼럼 중에서 길이가 512바이트 이상인 크기의 칼럼이 있는 경우GROUP BY
나 DISTINCT
칼럼에서 512바이트 이상인 크기의 칼럼이 있는 경우tmp_table_size
또는 max_heap_table_size
변수보다 크거나 (TempTable 엔진에서) temptable_max_ram
변수 값보다 큰 경우임시 테이블이 메모리에 생성됐는지 디스크에 생성됐는지 확인하려면 다음과 같이 확인해볼 수 있다.
-- // 현재 세션 상태 값 초기화
FLUSH STATUS;
SELECT first_name, last_name
FROM employees
GROUP BY first_name, last_name;
SHOW SESSION STATUS LIKE 'Created_tmp%';
|-------------------------|-------|
| Variable name | Value |
|---------------------------------|
| Created_tmp_disk_tables | 1 |
| Created_tmp_tables | 1 |
|-------------------------|-------|
Created_tmp_tables
: 쿼리 처리를 위해 만들어진 모든 내부 임시 테이블 개수를 누적하는 상태 값.Created_tmp_disk_tables
: 디스크에 내부 임시 테이블이 만들어진 개수만 누적해서 가지고 있는 상태 값