최적의 sort_buffer_size를 결정하는 방법은 무엇입니까?


10

다음과 같은 샘플 구성 파일을 읽었습니다.

# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.

filesort를 사용하는 몇 가지 쿼리가 있습니다. 디스크에 충돌하지 않고 쿼리를 원활하게 실행하는 데 필요한 버퍼 크기는 어떻게 결정합니까?


mysqltuner 또는 tuning-primer 를 실행 했습니까? 이 앱에서 my.cnf에 대해 흥미로운 것을 볼 수 있습니다.
David Martinez

답변:


14

sort_buffer_size를 처리 하는 상태 변수는 하나뿐입니다 . : 그건 당신이 문제의 메시지 뒤에이 무엇 Sort_merge_passes . MySQL 설명서는 다음과 같이 말합니다.

Sort_merge_passes : 정렬 알고리즘이 수행해야하는 병합 패스 수입니다. 이 값이 크면 sort_buffer_size 시스템 변수 의 값을 늘리는 것을 고려해야 합니다.

sort_buffer_size 에 대해 한 가지 명심하십시오

SHOW GLOBAL STATUS 출력에 초당 많은 Sort_merge_passes가 표시되면 sort_buffer_size 값을 증가시켜 쿼리 최적화 또는 개선 된 색인 작성으로 개선 할 수없는 ORDER BY 또는 GROUP BY 조작의 속도를 높일 수 있습니다.

을 올리면 s 및 s를 사용 sort_buffer_size하는 쿼리에 도움이 되지만 쿼리 최적화 프로그램에서 사용할 수있는 인덱스를 추가하고 개선 할 수있는 쿼리를 개선하는 것이 좋습니다.GROUP BYORDER BY

질문 남아 : Sort_merge_passes를 어떻게 확인합니까 ???

이 코드를 사용하여 지난 5 분 동안 발생한 Sort_merge_passes 수를 확인하십시오. 또한 시간당 Sort_merge_passes를 계산합니다.

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

Sort_merge_passes와 속도가 너무 높다면 sort_buffer_size를 자유롭게 늘리십시오 . 4M으로 올리려고한다고 가정하십시오. 당신은 이것을 실행할 것입니다 :

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

그런 다음 이것을 my.cnf에 추가하십시오.

[mysqld]
sort_buffer_size = 4M

다른 시간에 Sort_merge_passes 스파이크 를 확인하기 위해 정기적으로 코드를 실행합니다 .


2
이것은 훨씬 더 좋은 답변입니다
Greg

7
@RolanoMySQLDBA는 다음과 같이 "many"를 정의 할 수 있습니다. "초당 많은 Sort_merge_passes가 표시되는 경우"
Tarek

2

sort_buffer_size를 기본값에서 변경할 필요가 없습니다. 당신은 질문에 근거하여 그것을 잘못 이해합니다. SQL을 조사하여 색인을 사용하여 조정하고 ORDER BY / GROUP BY 조건을 충족시킬 수 있는지 확인해야합니다. 일반적으로 복합 인덱스입니다.

또한 : http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


그 게시물이 거의 유용하지 않다고 말해서 죄송합니다. 전문가가 아니기 때문에 사람들에게 무언가를하지 말라고 말하는 것과 같습니다. 첫 번째 주석 작성자가 지적한 것처럼 .cnfmysql과 함께 제공된 샘플 파일은 기본 설정을 사용하지 않습니다.
질문 오버플로

다시 읽으면 전문가는 이미 값을 기본값에서 변경하지 않는 것을 알고 있다고 말합니다. 샘플 .cnf 파일을 모범 사례로 사용하거나 참조해서는 안됩니다. my.cnf 파일 작성에 도움이 필요한 경우 Percona는 상당히 철저한 마법사를 제공합니다. tools.percona.com/wizard
eroomydna

2

매뉴얼 (5.0-5.5)의 지침은

SHOW GLOBAL STATUS 출력에 초당 많은 Sort_merge_passes가 표시되면 sort_buffer_size 값을 증가시켜 쿼리 최적화 나 향상된 인덱싱으로 개선 할 수없는 ORDER BY 또는 GROUP BY 작업의 속도를 높일 수 있습니다. 전체 버퍼가 필요한 것은 아니더라도 전체 버퍼가 할당되므로 전체적으로 필요한 것보다 크게 설정하면 정렬하는 대부분의 쿼리 속도가 느려집니다. 세션 설정으로 늘리고 더 큰 크기가 필요한 세션에 대해서만 늘리는 것이 가장 좋습니다. Linux에는 256KB 및 2MB의 임계 값이 있으므로 더 큰 값을 사용하면 메모리 할당 속도가 크게 느려질 수 있으므로 해당 값 중 하나보다 낮게 유지해야합니다. 워크로드에 가장 적합한 가치를 찾기 위해 실험하십시오.

5.6 이상에서 용어는 최적화 프로그램이 쿼리에 대한 값을 선택할 수 있으며 서버가 버퍼를 한계까지 확장 할 수 있음을 나타냅니다. 이것은 값을 너무 높게 설정하는 비용을 완화시킵니다. 따라서 5.6.4 이하의 릴리스에 대해서는 보수적이며 기본값보다 낮을 것 같지만 (릴리스 cnf 파일에서와 같이) 5.6에서 기본 2MB 또는 그 이상으로 더 높은 한계를 가질 수 있습니다. 전체 금액이 맹목적으로 할당되지 않기 때문에 4입니다.

MySQL 5.6.4부터 옵티마이 저는 필요한 공간을 계산하려고 시도하지만 한계까지 더 많은 공간을 할당 할 수 있습니다.


1

최적을 결정하는 가장 좋은 방법 sort_buffer_size은 벤치마킹하는 것입니다.

어떻게? @RolandoMySQLDBA와 마찬가지로 확인 Sort_merge_passes이 도움이 될 수 있지만 성능에 영향을 미치는 유일한 요인은 아닙니다. 을 늘릴 때주의해야합니다 sort_buffer_size.

문서 는 말합니다

Linux의 경우 임계 값이 256KB 및 2MB이며, 값이 클수록 메모리 할당 속도가 크게 느려질 수 있으므로 해당 값 중 하나보다 낮게 유지해야합니다.

테스트에 관한 게시물 이 있습니다.

sort_merge_passes그렇게 나쁘지 않습니다. sort_buffer_size0 sort_merge_passes이 되도록 충분히 크게 설정하면 최적이 아닐 수 있습니다.

테스트했을 때도 비슷한 결과가 나옵니다.

이상적으로는를 최적화해야하는 상황을 피하는 것이 가장 좋습니다 sort_buffer_size. 어떻게? 이 ORDER BY Optimization 문서 는 문제가 발생하는 방식을 이해하는 데 도움이 될 수 있습니다.


-1

"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" 정렬 버퍼 크기를 4m에 넣는 나쁜 방법은 정렬 버퍼 크기가 4GB를 사용하게 만드는 것입니다.

"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"

내가 당신이라면, 나는 짧은 버퍼 크기를 변경하려고 시도하지 않는다. 더 나은 쿼리를 작성하는 것이 좋습니다.


1
4K 정렬 버퍼에서 어떻게 큰 정렬을 수행 할 수 있습니까? 당신은 말했다 1024 * 4. 4096, 4K입니다.
RolandoMySQLDBA

롤란도의 말 ^^. 허용되는 최소값은 32K입니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.