8.4.4 MySQL이 내부 임시 테이블을 사용하는 방법
경우에 따라 서버가 쿼리를 처리하는 동안 내부 임시 테이블을 만듭니다. 그 테이블은 메모리에 유지하여 MEMORY 스토리지 엔진에 의해 처리하거나 디스크에 저장하여 MyISAM 스토리지 엔진에 의해 처리 할 수 있습니다. 서버는 처음 인 메모리 테이블로 내부에서 임시 테이블을 만들고이 너무 커질 경우에 그것을 디스크 테이블로 변환 할 수 있습니다. 서버가 내부 임시 테이블을 생성하는 타이밍이나 서버가 그것을 관리하기 위해 어떤 스토리지 엔진을 사용하는지에 대해 사용자가 직접 제어 할 수 없습니다.
임시 테이블은 다음과 같은 조건에서 생성 될 수 있습니다.
UNION쿼리가 임시 테이블을 사용합니다.TEMPTABLE알고리즘을 사용하여 평가하는 것이나,UNION또는 집합을 사용하는 등 일부 뷰에서 임시 테이블을 필요로합니다.ORDER BY절과 다른GROUP BY절이있는 경우 또는ORDER BY또는GROUP BY에 결합 큐의 첫 번째 테이블과 다른 테이블의 컬럼이 포함되어있는 경우, 임시 테이블이 만들어집니다.DISTINCT와ORDER BY함께 임시 테이블이 필요할 수 있습니다.SQL_SMALL_RESULT옵션을 사용하면 MySQL은 쿼리에 디스크 스토리지를 필요로하는 요소 (아래)도 포함되어 있지 않은 한, 인 메모리 임시 테이블이 사용됩니다.여러 테이블
UPDATE문.GROUP_CONCAT()또는COUNT(DISTINCT)평가.파생 테이블 (
FROM절의 서브 쿼리).서브 쿼리 또는 준 결합 실체화를 위해 작성되는 테이블.
쿼리에서 임시 테이블을 필요로하는지 여부를 판단하려면, EXPLAIN 을 사용하고 Extra 컬럼들을 체크하여 거기 Using temporary 지명되어 있는지 확인합니다 ( 섹션 8.8.1 "EXPLAIN에 따르면 쿼리 최적화 " 를 참조하십시오). EXPLAIN 에서 파생되거나 구체화 된 임시 테이블에 대해 반드시 Using temporary 표시하지 않을 수 있습니다.
내부 임시 테이블이 먼저 인 메모리 테이블로 작성된 이것이 너무 커질 경우 MySQL은이를 자동으로 디스크 테이블로 변환합니다. 인 메모리 임시 테이블의 최대 크기는 tmp_table_size 와 max_heap_table_size 의 최소치입니다. 이것은 CREATE TABLE 에 의해 명시 적으로 작성된 MEMORY 테이블과 다릅니다. 그런 테이블의 경우 max_heap_table_size 시스템 변수에서만 테이블이 얼마나 확대 할 디스크 포맷으로 변환이없는 것으로 판단됩니다.
서버는 내부 임시 테이블 (메모리 또는 디스크 중 하나)를 작성하면 Created_tmp_tables 상태 변수를 증가시킵니다. 서버는 디스크에 테이블 만들기 (내부 또는 인 메모리 테이블을 변환하는 경우) Created_tmp_disk_tables 상태 변수를 증가시킵니다.
상황에 따라서는 인 메모리 임시 테이블의 사용을 방해 할 수 있으며,이 경우 서버는 대신 디스크 테이블을 사용합니다.
테이블에
BLOB또는TEXT컬럼의 존재GROUP BY또는DISTINCT절에서 이진 문자열의 경우 512 바이트 또는 비 이진 문자열의 경우 512 문자보다 큰 문자열 컬럼의 존재. (MySQL 5.6.15 이전이 제한은 문자열의 형식에 관계없이 512 바이트입니다.)UNION또는UNION ALL이 사용 된 경우SELECT목록에서 512 (이진 문자열의 경우 바이트가 아닌 바이너리 문자열의 경우는 문자)보다 큰 최대 길이를 가진 문자열 컬럼의 존재.