[ Server Level 메모리 종류 ]

: 정적 변수이기 때문에 변경을 적용하려면 MySQL 서버를 재시작해야 한다.

* 글로벌 메모리 영역 : 클라이언트 스레드 수와 무관하게 일반적으로 하나의 메모리 공간만 할당되며, 필요에 따라 2개 이상 할당받을 수 있지만 각 공간이 모든 스레드에 의해 공유된다.
innodb_buffer_pool_size : 디스크에서 데이터를 메모리에 캐싱함과 동시에 데이터의 변경을 버퍼링하는 역할을 수행한다.
인덱스와 모든 데이터 페이지에 대해 캐시와 버퍼의 역할을 동시 수행한다.
일반적으로 전체 메모리의 50% ~ 70%까지 설정한다.

* Innodb_log_buffer_size : 데이터가 변경될 때 해당 변경사항을 바로 리두로그에 기록하지 않고, 일시적으로 메모리에 로그를 버퍼링한다.

* key_buffer_size : MyISAM의 키 버퍼는 인덱스만 대상으로 메모리에 저장하는 버퍼의 크기이다.
일반적으로 전체 메모리의 30~50% 할당하는 것이 좋다.

* innodb_additional_mem_pool_size

: (레퍼런스) 데이터 사전 정보 및 기타 내부 데이터 구조를 저장하는 데 사용. 응용 프로그램에 테이블이 많을 수록 여기에 더 많은 메모리를 할당한다. 만약 InnoDB가 이 메모리가 부족한 경우, os에서 메모리를 할당하기 시작하고 mysql error log에 경고 메시지를 기록한다.
: (realmysql) mysql 자체적으로 각 테이블의 메타정보를 메모리에서 관리하지만, InnoDB 스토리지 엔진도 자체적으로 각 테이블의 메타정보나 통계정보를 내부적으로 별도로 가지고 있다. 그러한 정보가 저장되는 공간의 크기를 결정하는 옵션이다.


[ 세션 단위 메모리 종류 ]

* 로컬(세션) 메모리 영역 : 클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리 영역으로, 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되지 않는다.
- 세션 단위 메모리는 각 세션별로 설정된 크기의 메모리 공간을 각각 할당된다.

예를 들어, 아래의 세션단위 메모리 값의 총 합이 10MB라고 한다면 한 커넥션 당 최대 10MB씩 사용하게 되고,
max connection 이 500개이라면, 최대 5GB의 메모리를 소모하게 될 수 있다.

따라서 아래 세션 단위 메모리 값들을 크게 설정하면, 각 클라이언트 스레드가 사용하는 메모리의 양이 커져서 서버의 메모리 여유량이 부족해질 수 있으므로, 필요한 경우 전역이 아닌 특정 세션에 대해서만 늘려주는 것이 좋다.

* sort_buffer_size : 인덱스를 사용할 수 없고 정렬이 필요할 때, 정렬알고리즘을 위해 사용되는 메모리 공간.
  - 정렬 알고리즘을 위한 필요 단위 공간보다 부족한 경우(이 크기가 작은 경우), 디스크 공간을 사용하여 정렬 알고리즘을 수행하기 때문에 디스크 IO를 유발한다.
  - 이 메모리 공간이 크다고 해서 정렬이 빨리 끝나는 것은 아니다.
  - 인덱스를 이용하여 정렬되면, 저장된 인덱스를 순서대로 읽기만 하고, 실제 정렬 알고리즘이 실행되는 것은 아니라서 빠르게 처리되는데, 정렬을 목적으로 인덱스를 사용할 수 없는 경우 정렬 대상 데이터를 메모리나 디스크버퍼에 저장해 정렬하게 된다.
  - 이 크기가 작을때, 만약 정렬해야 할 레코드 건수가 소트버퍼로 할당된 공간보다 크면, 여러 조각으로 나눠서 처리하기 위해 디스크에 결과를 임시 저장하는 작업이 반복되어, 디스크 IO를 유발한다.

* read_buffer_size : MyISAM 테이블을 sequencial scan하는 스레드가 각 테이블에 할당하는 버퍼
 - order by / nested loop 수행시 사용하는 버퍼 사이즈
  - order by 를 정렬 할 때, temp file (temp table아님)의 인덱스를 캐싱할 때 사용된다.
  - 파티션에 bulk insert 할 때 사용된다.
  - nested query의 결과를 캐싱할 때 사용된다.

* read_rnd_buffer_size : MyISAM 테이블에서의 읽기와 모든 스토리지 엔진에서 multi-range 읽기 최적화를 위해 사용된다.
  - 정렬된 순서로 테이블에서 행을 읽을 때 디스크 seek를 피하기 위해 이 버퍼를 통해 읽음
  - 정렬 대상 데이터가 커서 two-pass 알고리즘을 사용하는 경우, 데이터를 두번 읽어야 하는데 이 때 동일 데이터 페이지에 있는 레코드들을 모아서 한번에(빠르게) 읽기위해 버퍼링할 때 사용되는 버퍼이다.

 ** single pass 알고리즘 : 소트버퍼에 정렬기준컬럼을 포함해 select되는 모든 컬럼을 전부 담아서 정렬을 수행하는 방법으로, 정렬 완료되면 정렬 버퍼의 내용 그대로를 클라이언트로 넘겨줌
    - 정렬대상 레코드의 크기나 건수가 작은 경우 빠른 성능을 보인다.
 ** two pass 알고리즘 : 정렬대상컬럼과 pk키값만을 소트버퍼에 담아서 정렬을 수행하고, 정렬된 순서대로 다시 pk로 테이블을 읽어 select할 컬럼을 가져옴.
    - 테이블 레코드를 두번 읽어야 하기 때문에 불합리하나, 소트버퍼 공간은 더 적게 필요하다.
    - 정렬 대상 레코드의 크기나 건수가 상당히 많은 경우 효율적이다.



* join_buffer_size : 일반적인 인덱스 스캔, 범위 인덱스 스캔, 그리고 인덱스가 사용되지 않아서 풀테이블스캔이 발생하는 조인을 위해 사용되는 버퍼의 최소크기
  - 두 테이블 사이의 조인인 경우, 조인 단위로 1개의 버퍼가 할당되나, 여러 테이블간의 복잡한 조인인 경우 여러 조인버퍼가 필요할 수 있음
  - 필요한 만큼 할당되는 것이 아니라, join buffer가 필요한 시점에 모두 한꺼번에 할당 받게 되므로, 너무 크지 않게 설정하는 것을 권장한다.

* thread_stack : 각 스레드의 스택 크기
  - 크기가 너무 작으면, 서버가 핸들링할 수 있는 SQL 문장의 복잡도와, sp의 재귀 깊이 및 기타 메모리 소비 작업이 제한될 수 있다.

* binlog_cache_size : binlog의 내용을 즉시 디스크에 기록하는 게 아니라, 매모리의 임시공간에 잠시 버퍼링했다가 디스크로 기록하는데, 이 버퍼링할 메모리의 크기를 설정하는 변수.
max_heap_table_size : 사용자가 생성한 memory 테이블이 증가할 수 있는 최대 크기 (내부적으로 생성된 임시테이블도 포함)
  - 사용자가 명시적으로 생성한 memory 테이블은 max_heap_table_size로만 크기를 결정하고, 온디스크 형식으로 변환되지 않음


Print Friendly and PDF Posted by JJ*
: