2008년 12월 14일 일요일

MySQL기본구조 - 메모리할당

메모리 할당
복수의 스레드가 같은 메모리 영역에 액세스하는 경우(공유메모리, 글로벌 메모리라고 부름)하고 각 스레드가 독립된 메모리를 확보하는 경우가 있다. 
이런 메모리 할당은 서버변수와 불리는 변수(옵션)에 값을 지정하는것으로 설정가능하다. 

MySQL서버의 사용메모리양은 다음과 같이 계산이 가능하다. 

 글로벌 메모리 + 각 클라이언트스레드사용 메모리의 합계 

이것을 서버접속수를 감안한 식으로 변경하면 다음과 같이 된다. 
 
 글로벌 메모리 + 한개의 클라이언트용 스레드 사용 메모리 X 접속수

할당메모리를 지정하는 서버변수(옵션)에는 필요할 때 처음으로 메모리할당이 이루어지는 것도 있다. ( net_buffer_length, query_prealloc_size, thread_stack등은 스레드생성시에 항당 할당된다. 이같은 할당방법이 이루어지는 경우도 있다. )

그러나 빈번하게 사용될 것이 예상되는 메모리에서는  이 식에 미리 모든것을 넣어서 메모리 사용량을 계산한다. 

예를 들어 ORDER BY, GROUP BY,데이블결합은 빈번하게 이루어질 것이므로 sort_buffer_size라든지 join_buffer_size등은 높은 확률로 사용될 것이 예상된다.  따라서 메모리 계산식에는 이것들은 모두 고려한다. 
그런데 REPAIR TABLE은 지금 접속하고 있는 모든 클라이언트가 반드시 실행될 거라고는 도저히 생각되어지지 않고 1년에 몇번 셀 정도로 끝날 것이다. 따라서 myisam_sort_buffer_size는 메모리 사용량 계산에 넣지않는 경우도 있다.   걱정이 된다면 이 식에 계산된 값 + 알파정도..

mysqld옵션과 서버변수
MySQL서버(mysqld)에 부여하는 옵션을 나타낸다. 서식은 다음과 같다. 
 mysqld --option

이 mysqld옵션은 my.cnf에도 기술 가능하다. 명령어라인에 옵션을 지정하는 방법, my.cnf를 변경하는 방법 모두 mysqld정지와 재기동이 필요하다. 
또 옵션에는 서버 기동중에 SQL문으로 값을 변경할 수 있는 경우도 있다. 
이것은 서버변수라고 불리우는 경우도 있다.  예를 들어 값을 SQL문으로 변경하는경우에는 다음 처럼 한다.  다만 값을 부여할 때는 「K」「M」「G」단위는 사용할 수 없다. 
대신 산술연산자 「+」「-」「*」가 사용가능하다. 

>SET문으로 값을 변경하는 경우 
 mysql> SET GLOBAL sort_buffer_size=1024*1024;
 mysql> SET @@global.sort_buffer_size=1048576;
 mysql> SET SESSION sort_buffer_size=1048576;
 mysql> SET @@session.sort_buffer_size=1048576;
 mysql> SET LOCAL sort_buffer_size=1048576;
 mysql> SET @@local.sort_buffer_size=1048576;
 mysql> SET @@sort_buffer_size=1048576;
 mysql> SET sort_buffer_size=1048576; 

SET GLOBAL 변수명과 SET @@global.변수명은 같다. 
다음 기술은 SET SESSION 변수명과 같다. 
>SET문 사용법
SET @@session.변수명
SET 변수명
SET @@변수명
SET LOCAL 변수명
SET @@local.변수명

SET GLOBAL은 새롭게 접속해온 모든 클라이언트 스레드에 영향을 미친다.  일부는 현재 접속중의 다른 클라이언트 스레드에게도 영향을 미친다. (모든 변수가 영향을 받는 것은 아니다. )

SET SESSION는 SET문을 실행한 클라인트의 스레드만 영향을 미친다. 다른 스레드는 영향을 받지 않는다.  접속을 끊으면 설정은 없어진다. 

모든 옵션과 변수가 이런식으로 변경될 수 있는 것은 아니다. 또 GLOBAL,SESSION의 지정도 모두가 양쪽 다 지정될 수 있는 것은 아니다. 

현재 옵션이나 변수의 값을 확인하는 방법은 다음과 같다. 

>현재의 옵션과 변수의 값을 확인하는 방법
mysql> SHOW VARIABLES;
mysql> SELECT * FROM information_schema.GLOBAL_VARIABLES;
mysql> SELECT * FROM infromation_schema.SESSION_VARIABLES;

shell$ mysqladmin -uroot variables;
shell$ mysqld --verbose --help

나중에 mysqld옵션및 서버변수를 정리해 보겠다.  변수와 옵션이 스위치의 경우(bool형) 부여되는 값은 「1」「ON」「YES」「ENABLE」「TRUE」로 표현되지만  전부 「유효」라는 의미가 된다.  이 bool형 변수에 대해서 SET문으로 값을 정할 경우에 값「1」을 지정하면 정확하게 스위치 ON이 되지만 그 밖의 지정방법은 제대로 설정되지 않는 경우도 있다.