MySQL이 디스크에 너무 많은 임시 테이블을 생성하는 이유는 무엇입니까?


13

mysql..mysql 튜너 쇼에서 구성 실수로 너무 많은 임시 테이블을 생성 할 수 있습니까?

Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk

table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%

초기 임시 테이블은 "23725 임시 테이블 중 38 %가 디스크에 작성되었습니다"이지만 max_heap 및 tmp_table을 16m에서 200m으로 변경했으며 30 %로 낮아졌습니다.

구성 :

engine myisam 
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800

기본 구성을 가진 다른 시스템은 동일한 데이터베이스와 함께 "23725 임시 테이블 중 1 %가 디스크에 작성되었습니다"를 표시합니다.

이 문제로 컴퓨터에서 기본값으로 변경하려고 시도했지만 여전히 "580 개의 임시 테이블 중 16 %가 디스크에서 생성되었습니다"라는 메시지가 표시됩니다.

48GB 램과 함께 Ubuntu 11.4 64 비트를 사용하고 있습니다. 아무도 해결책을 제안 할 수 있습니까?

"group by"를 사용하여 테이블에서 DB 엔진을 "myisam"에서 "memory"로 변경하면이 문제가 해결됩니까? 여기에 설명 된대로 : http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

답변:


16

mysqltuner는 유용한 정보를 거의 제공하지 않습니다. "적중률"에 대한 대부분 관련이없는 통계를 사용하며 허용 가능한 위젯 수에 대한 임의의 한계를 설정합니다. 성능 문제가 발생하지 않으면 실제로 발생하는 문제를 해결할 필요가 없습니다. 즉, 임시 테이블에 대한 약간의 배경 정보가 있습니다 ...

MySQL은 내부적으로 MEMORY 스토리지 엔진을 사용하여 암시 적 임시 테이블을 만듭니다. 디스크 임시 테이블에서 MyISAM 스토리지 엔진을 사용하십시오.

다음과 같은 경우 임시 테이블이 디스크에 작성됩니다.

  • TEXT 또는 BLOB 필드가 있습니다 (MEMORY는 이러한 유형을 지원하지 않기 때문에)
  • 결과 내재 된 임시 테이블의 크기가보다 작은 tmp_table_size또는max_heap_table_size
  • 512 바이트 이상의 열이 GROUP BY 또는 UNION 또는 ORDER BY와 함께 사용되는 경우

자세한 내용은 내부 임시 테이블에 대한 MySQL 설명서 를 읽으십시오 .

이것에 대해 무엇을 할 수 있습니까? 실제로 성능 문제를 나타내는 것으로 가정하면 (지능적으로 귀찮게하는 대신)

  • TEXT / BLOB 필드를 피하고 가능한 경우 적절한 크기의 VARCHAR 또는 CHAR 필드를 사용하십시오.
  • TEXT / BLOB를 피할 수없는 경우 외래 키 관계로 테이블을 분리하고 필요할 때만 참여하도록 분리하십시오.
  • 위에서 언급 한 TEXT / BLOB 필드처럼 512 바이트 이상의 큰 열을 처리하십시오.
  • 쿼리가 필요한 결과 세트 만 리턴하는지 확인하십시오 (적절하게 선택적인 WHERE 절, SELECT * 피)
  • 하위 쿼리를 피하고 특히 큰 결과 집합을 반환하는 경우 조인으로 대체
  • 마지막 리조트 - 인상 모두 tmp_table_sizemax_heap_table_size. 쿼리를 최적화 할 수없는 경우가 아니면이 작업을 수행하지 마십시오.

MySQL 구성이 걱정되고 사용 가능한 설정에 익숙하지 않은 경우 Percona 구성 마법사 를 시작점으로 사용하십시오.

"group by"를 사용하여 테이블에서 DB 엔진을 "myisam"에서 "memory"로 변경하면이 문제가 해결됩니까? 여기에 설명 된대로

아니요, 테이블이 디스크에 유지되지 않도록하지 않습니다. 이러지 마


하나는, 그러나 더 적은의 있다는 추가 tmp_table_size또는max_heap_table_size
데릭 다우니을

mysqltuner가 가장 권장하는 것은 느린 쿼리 로그를 활성화하는 것이 었습니다. 느린 쿼리가있는 경우이를 식별하는 데 도움이됩니다.
fat_mike

2

"임시 사용"과 "파일 정렬 사용"은 세상의 끝이 아닙니다!

SELECT ... GROUP BY a, b ORDER BY c, d-1 또는 2 개의 "임시 테이블"이 필요합니다.

쿼리에서 임시 테이블을 사용하는 경우가 있습니다. 임시 테이블을 사용하면 쿼리가 느려질 수 있습니다. 그러나 쿼리가 여전히 "충분히 빠르다"고해도 걱정하지 않아도됩니다.

쿼리가 너무 느리면 (tmp 테이블 유무에 관계없이) 논의 해 봅시다. SHOW CREATE TABLE, SHOW TABLE STATUS 및 EXPLAIN을 입력하십시오.


1
에 인덱스 (a, b, c, d)가 있으면 임시 테이블이 없습니다.
Yvan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.