2010-07-09 2 views
5

우선, 나는 mysql을 최적화하는 것에 익숙하지 않다. 사실 나는 내 웹 응용 프로그램 (초당 약 400 개의 쿼리)에서 GROUP BY을 사용하는 쿼리를 피할 수 없다는 점과 임시 테이블을 만드는 것이 원인이라는 사실입니다. 내 구성했다 :최적의 MySQL 임시 테이블 (메모리 테이블) 구성?

max_heap_table_size = 16M 
tmp_table_size = 32M 

그 결과 디스크 퍼센트 +에 임시 테이블 - 12.5 % 그리고

내 설정을 변경, this post

max_heap_table_size = 128M 
tmp_table_size = 128M 

결과에 따라 : 디스크에 임시 테이블 % + - 18 %

결과가 예상되지 않았으므로 이유를 이해하지 못합니다.

잘못 되었습니까? tmp_table_size = max_heap_table_size? 크기를 늘리지 않아야합니까?

쿼리

SELECT images, id 
FROM classifieds_ads 
WHERE parent_category = '1' AND published='1' AND outdated='0' 
GROUP BY aux_order 
ORDER BY date_lastmodified DESC 
LIMIT 0, 100; 

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort | 
+1

사과 할 필요가 없습니다. 영어 실력이 좋습니다. –

+0

OMG 조랑말과 동의하십시오; 우리는 아무도 그들의 영어가 훌륭하지 않을 경우를 대비하여 질문을하지 않을 것을 희망합니다. –

+0

당신의 서면 영어가 내가 일하는 불행한 영어 원어민 동료들보다 낫습니다! :) –

답변

9

는 "임시 사용"임시 테이블은 디스크에 있었다라고 우리에게 이야기하지 않는 보고서를 EXPLAIN에 대해 설명합니다. 질의가 임시 테이블을 생성 할 것으로 예상한다는 것만 알립니다.

임시 테이블은 크기가 tmp_table_size max_heap_table_size보다 작 으면 메모리에 남아 있습니다.

Max_heap_table_size는 테이블이 임시 테이블이든 비 임시 테이블이든 MEMORY 스토리지 엔진에서 테이블이 가질 수있는 최대 테이블입니다.

Tmp_table_size는 쿼리에서 자동으로 테이블을 만들 때 메모리에 저장할 수있는 최대 테이블입니다. 그러나 이것은 어쨌든 max_heap_table_size보다 클 수 없습니다. 따라서 tmp_table_size를 max_heap_table_size보다 크게 설정하면 아무런 이점이 없습니다. 이 두 가지 구성 변수를 동일한 값으로 설정하는 것이 일반적입니다.

당신은 많은 임시 테이블이 작성하는 방법을 모니터링하고, 같은 디스크에 얼마나 많은 수

mysql> show global status like 'Created%'; 
+-------------------------+-------+ 
| Variable_name   | Value | 
+-------------------------+-------+ 
| Created_tmp_disk_tables | 20 | 
| Created_tmp_files  | 6  | 
| Created_tmp_tables  | 43 | 
+-------------------------+-------+ 

참고이 예에서, 43 개 임시 테이블이 작성되었지만, 그 중 20은 디스크에 있었다.

tmp_table_size 및 max_heap_table_size의 제한을 늘리면 더 큰 임시 테이블이 메모리에 존재할 수 있습니다.

당신은 얼마나 크게 만들어야합니까? 반드시 모든 단일 임시 테이블이 메모리에 맞게 충분히 커질 필요는 없습니다. 임시 테이블의 95 %를 메모리에 저장하고 나머지 희소 한 테이블 만 디스크에 저장하려고 할 수 있습니다. 마지막 5 %는 매우 클 수 있습니다. 사용하려는 메모리 용량보다 훨씬 많습니다.

제 연습은 tmp_table_size와 max_heap_table_size를 보수적으로 늘리는 것입니다. 그런 다음 의 비율이 Created_tmp_disk_tables의 Created_tmp_disk_tables 중 인 것을 확인하여 95 %의 메모리를 메모리에 유지하려는 목표를 달성했는지 확인하십시오.

불행히도 MySQL에는 정확한 임시 테이블의 크기를 알려주지 못합니다. 그것은 쿼리마다 다르므로 상태 변수는 그 값이 몇 번이나 발생했는지 보여줄 수 없습니다. 그리고 EXPLAIN은 실제로 쿼리를 실행하지 않으므로 일치하는 데이터의 양을 정확히 예측할 수 없습니다.

대안은 Percona Server으로, 개선 된 MySQL 배포판입니다. 이 중 하나는 log extra information in the slow-query log입니다. 여분의 필드에는 주어진 쿼리에 의해 생성 된 임시 테이블의 크기가 포함됩니다.