8.11.4.1 MySQL의 메모리 사용 방법
다음 목록은 mysqld 서버가 메모리를 사용하는 방법의 일부를 보여줍니다. 해당하는 경우 메모리 사용과 관련된 서버 변수의 이름도 보여줍니다.
모든 스레드는
MyISAM
키 버퍼를 공유하고 그 크기는key_buffer_size
변수에 의해 결정됩니다. 서버가 사용하는 다른 버퍼는 필요에 따라 할당됩니다. 섹션 8.11.2 "서버 파라미터의 튜닝」 을 참조하십시오.클라이언트 연결의 관리에 사용되는 각 스레드는 약간의 thread 고유의 영역을 사용합니다. 다음 목록에 이들과 그 크기를 제어하는 변수를 나타냅니다.
스택 (변수
thread_stack
)연결 버퍼 (변수
net_buffer_length
)결과 버퍼 (변수
net_buffer_length
)
연결 버퍼와 결과 버퍼는 각
net_buffer_length
바이트로 동일한 크기에서 시작되지만, 필요에 따라max_allowed_packet
바이트까지 동적으로 확대됩니다. 결과 버퍼는 각 SQL 문 뒤에net_buffer_length
바이트로 축소됩니다. 문이 실행되는 동안 현재 문 문자열의 복사도 할당됩니다.모든 스레드에서 동일한 기본 메모리를 공유합니다.
스레드가 필요하지 않은 경우 그것에 할당 된 메모리가 해제되고 스레드가 스레드 캐시로 돌아 가지 않는 한, 시스템에 반환됩니다. 이 경우 메모리는 할당 된 상태로 유지됩니다.
myisam_use_mmap
시스템 변수를 1로 설정하여 모든MyISAM
테이블에 대한 메모리 맵을 사용할 수 있습니다.테이블의 순차적 스캔을 실행하는 각 요청은 read buffer (변수
read_buffer_size
)를 할당합니다.행을 임의의 순서로 읽을 경우 (예를 들어, 정렬에 이어), random-read buffer (변수
read_rnd_buffer_size
)를 할당하여 디스크 검색을 피할 수 있습니다.모든 결합은 단일 경로에서 실행되는 대부분의 조인은 임시 테이블을 사용하지 않고 실행할 수 있습니다. 대부분의 임시 테이블은 메모리 기반의 해시 테이블입니다. 큰 줄 길이 (모든 컬럼 길이의 합으로 산출되는)을 가질 지
BLOB
컬럼을 포함한 임시 테이블은 디스크에 저장됩니다.내부 인 메모리 임시 테이블이 너무 커지면, MySQL은 테이블을 인 메모리에서
MyISAM
스토리지 엔진에 의해 처리되는 디스크 포맷으로 변경하여이를 자동으로 처리합니다. 섹션 8.4.4 "MySQL이 내부 임시 테이블을 사용하는 방법" 에 설명하도록 허용 된 임시 테이블의 크기를 늘릴 수 있습니다.정렬을 수행하는 대부분의 요청은 정렬 버퍼 및 결과 세트 크기에 따라 0-2 개의 임시 파일을 할당합니다. 섹션 B.5.4.4 "MySQL이 임시 파일을 저장할 위치" 를 참조하십시오.
거의 모든 분석과 계산은 스레드 로컬 재사용 가능한 메모리 풀에서 실행됩니다. 작은 품목은 메모리 오버 헤드가 필요 없기 때문에 일반 느린 메모리 할당과 해제가 해결됩니다. 메모리는 예상치 못한 큰 문자열에만 할당됩니다.
열리는
MyISAM
테이블마다 인덱스 파일이 1 회 열려 데이터 파일은 동시 실행 중의 thread마다 1 회 열린다. 동시 스레드마다 테이블 구조, 각 컬럼의 컬럼 구조 및 크기3 *
의 버퍼를 할당합니다 (여기서N
N
은 최대 유키나가하고,BLOB
컬럼을 계산하지 않습니다).BLOB
컬럼은 5에서 8 바이트 +BLOB
데이터의 길이가 필요합니다.MyISAM
스토리지 엔진은 내부 사용을위한 1 개의 여분의 라인 버퍼를 유지합니다.BLOB
컬럼이있는 테이블마다 큰BLOB
값을 읽을 버퍼가 동적으로 확대됩니다. 테이블을 스캔하는 경우 최대BLOB
치와 같은 크기의 버퍼가 할당됩니다.사용중인 모든 테이블 핸들러 구조가 캐쉬에 저장되며 FIFO로 관리됩니다. 초기 캐시 크기는
table_open_cache
시스템 변수의 값을 가져옵니다. 테이블이 동시에 2 개의 실행중인 스레드가 사용되는 경우, 캐시는 그 테이블의 두 항목이 포함됩니다. 섹션 8.4.3.1 "MySQL에서 테이블 열고 닫는 방법" 을 참조하십시오.FLUSH TABLES
명령문 또는 mysqladmin flush-tables 명령은 사용하지 않는 모든 테이블을 한번에 닫고 현재 실행중인 스레드의 종료시 닫히도록 사용중인 모든 테이블을 표시합니다. 따라서 사실상 대부분의 사용중인 메모리가 해제됩니다.FLUSH TABLES
은 모든 테이블이 닫힐 때까지 돌아 오지 않습니다.GRANT
,CREATE USER
,CREATE SERVER
및INSTALL PLUGIN
명령문의 결과로 서버 정보를 메모리에 캐시합니다. 이 메모리는 해당REVOKE
,DROP USER
,DROP SERVER
및UNINSTALL PLUGIN
문에 의해 해제되지 않으므로 캐시를 발생시키는 문 다수의 인스턴스를 실행하는 서버에서는 메모리 사용량이 증가합니다. 이 캐시 된 메모리는FLUSH PRIVILEGES
에서 해제 할 수 있습니다.
ps 및 기타 상태 프로그램은 mysqld가 많은 메모리를 사용하고 있는지보고 할 수 있습니다. 이것은 다양한 메모리 주소의 스레드 스택에 의해 발생 될 수 있습니다. 예를 들어, Solaris 버전의 ps는 스택 사이의 사용하지 않는 메모리를 사용하는 메모리로 간주됩니다. 이를 확인하려면 swap -s
에서 사용 가능한 스왑을 체크합니다. 일부 메모리 누수 탐지 도구 (상용 및 오픈 소스 모두)로 mysqld를 테스트하고 있기 때문에 메모리 누수는 없을 것입니다.