메모리
버퍼풀 크기는 운영 중에 조정할 수 있지만, innodb_buffer_pool_chunk_size 와 innodb_buffer_pool_instances 는 기동 시점에 고정된다. 크기를 나중에 올릴 계획이라면 이 두 값을 첫 구성에서 함께 정한다. 버퍼풀과 임시 테이블 계열은 기본값이 실서비스 규모와 거리가 있다.
innodb_buffer_pool_size
- 기본값은
134217728(128MB), 최소값은5242880(5MB)이다. 전역 범위이고 동적 변경이 가능하다. - 공식 권고는 시스템 메모리의 50~75% 다.
- 버퍼풀 크기는 항상
innodb_buffer_pool_chunk_size와innodb_buffer_pool_instances의 곱과 같거나 그 배수여야 한다. 동적으로 올려도 이 배수로 반올림되므로, 청크 크기와 인스턴스 수는 기동 시점에 정해야 한다. 청크 개수는 1000 을 넘지 않게 둔다. innodb_buffer_pool_chunk_size기본값은134217728(128MB)이고 동적 변경이 불가하다.innodb_buffer_pool_instances도 동적 변경이 불가하며, 8.0 기본값 8(버퍼풀이 1GiB 미만이면 1)에서 8.4 는 산식 기반으로 바뀌었다. 8.4 산식은 버퍼풀 힌트(크기를 청크 크기로 나눈 값의 1/2)와 CPU 힌트(가용 논리 프로세서 수의 1/4) 중 최솟값이다.--innodb-dedicated-server를 켜면 명시하지 않은 버퍼풀 크기가 자동 설정된다.Innodb_buffer_pool_wait_free가 계속 늘어난다면 버퍼풀이 부족하다는 신호다.
[mysqld]
# 메모리 32GiB 전용 서버에서 75%
innodb_buffer_pool_size = 24G
innodb_buffer_pool_chunk_size = 128M
임시 테이블
internal_tmp_mem_storage_engine의 기본값은TempTable이다(8.0.2 도입). 허용값은TempTable과MEMORY이고, 세션 값 변경에는SESSION_VARIABLES_ADMIN또는SYSTEM_VARIABLES_ADMIN권한이 필요하다.internal_tmp_disk_storage_engine은 8.0.16 에서 제거됐다.- TempTable 은
VARCHAR·VARBINARY와 바이너리 대형 객체 타입을 효율적으로 저장한다. MEMORY 는 고정 길이 행 포맷을 써서VARCHAR·VARBINARY를 컬럼 최대 길이까지 패딩해CHAR·BINARY처럼 저장한다. 디스크 임시 테이블은 8.4 에서 InnoDB 만 사용한다. tmp_table_size기본값은16777216(16MiB)이다. TempTable 로 만든 개별 인메모리 임시 테이블의 최대 크기를 정하며, 한도에 닿으면 InnoDB 디스크 임시 테이블로 자동 전환된다.max_heap_table_size기본값도16777216(16MiB)이지만 TempTable 에서는 무관하다.tmp_table_size와max_heap_table_size중 작은 값이 상한이라는 규칙은 MEMORY 엔진을 쓸 때만 성립한다. 명시적으로CREATE TABLE ... ENGINE=MEMORY로 만든 테이블은max_heap_table_size만 적용되고 디스크 전환이 없다.
| 파라미터 | 8.0 기본값 | 8.4 기본값 | 도입 |
|---|---|---|---|
temptable_max_ram |
1GiB | 총메모리 3%(1–4GiB) | 8.0.2 |
temptable_max_mmap |
1GiB | 0 |
8.0.23 |
temptable_use_mmap |
ON |
OFF(deprecated) |
8.0.16 |
temptable_max_mmap=0은temptable_use_mmap=OFF와 같다.temptable_use_mmap은 8.0.26 에서 deprecated 됐다.tmp_table_size가temptable_max_ram보다 작으면 인메모리 임시 테이블은tmp_table_size를 넘을 수 없다. 반대로 크면temptable_max_ram과temptable_max_mmap의 합계가 상한이 된다.- 스레드-로컬 메모리 블록(요청이 1MB 미만이면 1MB)은
temptable_max_ram한도에 포함되지 않고 스레드가 끝날 때까지 유지된다. - 임시 테이블이 디스크로 강제되는 조건은 세 가지다.
- 테이블에
BLOB또는TEXT컬럼이 있는 경우. 단 TempTable 은 이 타입을 지원하므로 이 조건을 절대 규칙으로 보면 안 된다. UNION또는UNION ALL을 쓸 때SELECT리스트에 최대 길이가 512 를 넘는 문자열 컬럼이 있는 경우(바이너리 문자열은 바이트, 그 외는 문자 단위).SHOW COLUMNS와DESCRIBE는 일부 컬럼 타입을BLOB으로 잡으므로 결과용 임시 테이블이 디스크 테이블이 된다.
- 테이블에
- 관측은
Created_tmp_tables와Created_tmp_disk_tables로 한다. 후자는 메모리맵 파일에 만든 디스크 임시 테이블을 세지 않는다.
MyISAM 전용 파라미터
key_buffer_size는 MyISAM 인덱스 블록만 캐싱한다. InnoDB 는 버퍼풀을 쓰고 키 캐시를 쓰지 않는다.- 기본 상태에서 약 8MiB(
8384512)가 잡혀 있고,SET GLOBAL key_buffer_size = 0으로도 기본 키 캐시 자체를 없앨 수는 없다. 문서는 이 시도가 무시된다고 적는다. - 값이
0이거나 최소 블록 버퍼 8개를 잡지 못할 만큼 작으면 키 캐시를 쓰지 않고, 인덱스 파일은 OS 가 제공하는 파일시스템 버퍼링만으로 접근한다. - 8.4 부터
keycache1.key_buffer_size형태의 복합 구조 변수 문법은 deprecated 다. bulk_insert_buffer_size도 MyISAM 의 대량 삽입에 쓰인다. InnoDB 는 이 버퍼를 쓰지 않으므로 MyISAM 을 쓰지 않으면 조정할 이유가 없다.
Advertisement