Loading...
MySQL 9.5 Reference Manual 9.5의 10.6.3 Optimizing REPAIR TABLE Statements의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MyISAM 테이블에 대한 REPAIR TABLE 은
수리 작업을 위해 myisamchk 를 사용하는 것과 유사하며,
일부 동일한 성능 최적화가 적용됩니다:
myisamchk 에는 메모리 할당을 제어하는 변수들이 있습니다.
Section 6.6.4.6, “myisamchk Memory Usage” 에 설명된 대로 이러한 변수들을 설정함으로써 성능을 향상시킬 수 있습니다.
REPAIR TABLE 의 경우에도 동일한 원리가 적용되지만,
수리 작업이 서버에 의해 수행되므로
myisamchk 변수 대신 서버 시스템 변수를 설정해야 합니다.
또한 메모리 할당 변수를 설정하는 것에 더하여,
myisam_max_sort_file_size
시스템 변수를 늘리면 수리가 더 빠른 filesort 방식으로 수행되고
느린 키 캐시 방식의 수리를 피할 가능성이 높아집니다.
테이블 파일의 사본을 보관할 수 있을 만큼의 충분한 여유 공간이 있는지 확인한 후,
시스템의 최대 파일 크기로 변수를 설정하십시오.
여유 공간은 원래 테이블 파일이 존재하는 파일 시스템에 있어야 합니다.
myisamchk 테이블 수리 작업이 다음 옵션들을 사용하여 그 메모리 할당 변수를 설정한 상태로 수행된다고 가정합니다:
1--key_buffer_size=128M --myisam_sort_buffer_size=256M 2--read_buffer_size=64M --write_buffer_size=64M
이들 myisamchk 변수 중 일부는 서버 시스템 변수에 대응합니다:
| myisamchk Variable | System Variable |
|---|---|
key_buffer_size | key_buffer_size |
myisam_sort_buffer_size | myisam_sort_buffer_size |
read_buffer_size | read_buffer_size |
write_buffer_size | 없음 |
각 서버 시스템 변수는 런타임에 설정할 수 있으며,
그 중 일부
(myisam_sort_buffer_size,
read_buffer_size)
는 글로벌 값에 더해 세션 값도 가지고 있습니다.
세션 값을 설정하면 변경의 영향을 현재 세션으로 제한하며
다른 사용자에게는 영향을 미치지 않습니다.
글로벌 전용 변수
(key_buffer_size,
myisam_max_sort_file_size)
를 변경하면 다른 사용자에게도 영향을 줍니다.
key_buffer_size 의 경우,
이 버퍼가 다른 사용자와 공유된다는 점을 고려해야 합니다.
예를 들어, myisamchk 의
key_buffer_size 변수를 128MB 로 설정한 경우,
다른 세션의 활동이 키 버퍼를 사용할 수 있도록
(이미 더 크게 설정되어 있지 않다면)
해당하는
key_buffer_size 시스템 변수를
그보다 더 크게 설정할 수 있습니다.
그러나 글로벌 키 버퍼 크기를 변경하면 버퍼가 무효화되어
다른 세션에 대해 디스크 I/O 증가와 속도 저하를 초래합니다.
이 문제를 피하는 또 다른 방법은 별도의 키 캐시를 사용하고,
수리할 테이블의 인덱스를 그 캐시에 할당한 다음,
수리가 완료되면 이를 해제하는 것입니다.
Section 10.10.2.2, “Multiple Key Caches” 를 참조하십시오.
앞의 설명을 바탕으로,
REPAIR TABLE 작업은
myisamchk 명령과 유사한 설정을 사용하도록
다음과 같이 수행할 수 있습니다.
여기서는 별도의 128MB 키 버퍼가 할당되며
파일 시스템이 최소 100GB 의 파일 크기를 허용한다고 가정합니다.
1SET SESSION myisam_sort_buffer_size = 256*1024*1024; 2SET SESSION read_buffer_size = 64*1024*1024; 3SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024; 4SET GLOBAL repair_cache.key_buffer_size = 128*1024*1024; 5CACHE INDEX tbl_name IN repair_cache; 6LOAD INDEX INTO CACHE tbl_name; 7REPAIR TABLE tbl_name ; 8SET GLOBAL repair_cache.key_buffer_size = 0;
글로벌 변수를 변경하려 하지만
다른 사용자에게 미치는 영향을 최소화하기 위해
이를 REPAIR TABLE 작업이 진행되는 동안에만 변경하고자 한다면,
그 값을 사용자 변수에 저장해 두었다가 나중에 복원하십시오.
예를 들면 다음과 같습니다:
1SET @old_myisam_sort_buffer_size = @@GLOBAL.myisam_max_sort_file_size; 2SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024; 3REPAIR TABLE tbl_name ; 4SET GLOBAL myisam_max_sort_file_size = @old_myisam_max_sort_file_size;
REPAIR TABLE 에 영향을 미치는 시스템 변수들은
기본적으로 값이 적용되도록 하려는 경우
서버 시작 시 글로벌하게 설정할 수 있습니다.
예를 들어, 다음 줄들을 서버의 my.cnf 파일에 추가하십시오:
1[mysqld] 2myisam_sort_buffer_size=256M 3key_buffer_size=1G 4myisam_max_sort_file_size=100G
이 설정에는
read_buffer_size 가 포함되어 있지 않습니다.
read_buffer_size 를 글로벌하게 큰 값으로 설정하면
모든 세션에 적용되며,
동시 세션이 많은 서버에서 메모리 과도 할당으로 인해
성능 저하를 초래할 수 있습니다.
10.6.2 Bulk Data Loading for MyISAM Tables
10.7 Optimizing for MEMORY Tables