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 (이진 문자열의 경우 바이트가 아닌 바이너리 문자열의 경우는 문자)보다 큰 최대 길이를 가진 문자열 컬럼의 존재.