MySQL/MariaDB Sort Buffer
· Version : MySQL, MariaDB
MySQL/MariaDB에서는 데이터를 정렬(ORBER BY)하기 위해 별도의 메모리 공간을 할당하는데 이때 사용되는 메모리가 Sort buffer이다. 이 메모리는 정렬이 필요할 경우에만 할당되며, 쿼리 실행이 완료되면 시스템으로 즉시 반납된다. Soft buffer의 크기는 시스템 설정 변수인 sort_buffer_size로 조정 할 수 있다. sort_buffer_size는 byte단위로 표시된다.
show variables where Variable_Name like '%sort_buffer%'; |
정렬해야하는 데이터의 크기가 작은 경우에는 Sort buffer 만으로 충분할 수도 있지만, 정렬해야하는 데이터가 sort buffer보다 큰 경우에는 정렬해야하는 데이터를 여러 조각으로 나누어서 처리되며, 임시 저장을 위해 디스크를 사용한다. 그리고 디스크에 저장된 데이터를 다시 메모리로 읽어 처리하고, 다시 디스크에 저장하는 행위를 반복한다.
여러 조각으로 나누어진 데이터를 정렬을 위해서 디스크에 쓰고 읽고를 반복하는 것을 Multi-Merge 라고 하는데, Multi-Merge 횟수는 sort_merge_passes 라는 변수에 누적되기 때문에 모니터링이 가능하다. Multi-Merge가 발생하게되면 디스크를 사용하는데, 디스크의 성능은 메모리보다 느리기 때문에 실제 쿼리 요청이 느려질 수 있다. 이러한 디스크 사용을 줄이기 위해 sort_buffer_size를 증가 시킬수도 있지만, 특정 크기 이상 부터는 더 이상의 성능 향상을 기대하기 어렵다. 아래 그림의 테스트 자료를 보면 1MB 부터는 큰 성능 향상이 없는것을 확인할 수 있다.
출처 : https://www.percona.com/blog/2010/10/25/impact-of-the-sort-buffer-size-in-mysql/
sort_buffer_size의 영역은 각 세션 마다 할당되기 때문에 너무 큰 sort_buffer_size는 자칫하면 메모리 부족현상을 겪을 수 있다. 또한 메모리가 부족할시 OS에서는 강제적으로 프로세스를 Kill할 수 있으므로 MySQL/MariaDB의 프로세스가 중지될 수도 있기 때문에 주의해야 한다.
2019-09-19 / 강성욱 / http://sungwookkang.com
MySQL, MariaDB, Sort Buffer, sort_buffer_size, sort_merge_passes, Multi-Merge
'MySQL, MariaDB' 카테고리의 다른 글
MySQL MMM 구성 (Centos7 + MySQL 8.0) (1) | 2020.02.01 |
---|---|
MySQL/MariaDB Single-pass, Two-pass Sort Algorithm (0) | 2019.09.21 |
MySQL/MariaDB Full Table Scan (0) | 2019.09.19 |
MariaDB 히스토그램 (옵티마이저가 실행계획 생성시 참고하는 데이터 분포 정보) (0) | 2019.09.18 |
MySQL /MariaDB 통계 정보 (0) | 2019.09.12 |