MyISAM 스토리지 엔진의 성능에 영향을 미치는 요소인 키 캐시와 운영체제의 캐시/버퍼에 대해 살펴보자.
InnoDB의 버퍼 풀과 비슷한 역할을 하는 것이 MyISAM의 키 캐시(Key cache, 키 버퍼라고도 불림)다. 하지만 이름 그대로 MyISAM 키 캐시는 인덱스만 대상으로 작동하며 또한 인덱스의 디스크 크기 작업에 대해서만 부분적으로 버퍼링 역할을 한다. 키 캐시가 얼마나 효율적으로 작동하는지는 다음 수식으로 간단히 확인해 볼 수 있다.
키 캐시 히트율(Hit rate) = 100 - (Key_reads / Key_read_requests * 100)
Key_reads는 인덱스를 디스크에서 읽어들인 횟수를 저장하는 상태 변수이며, Key_read_requests는 키 캐시로부터 인덱스를 읽은 횟수를 저장하는 상태 변수다. 이 상태 값을 알아보려면 다음과 같이 "SHOW GLOBAL STATUS" 명령을 사용하면 된다.
mysql > SHOW GLOBAL STATUS LIKE 'KEY%';
+---------------------------+---------+
| Variable_name | Value |
+---------------------------+---------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 13 |
| Key_block_used | 1 |
| Key_read_requests | 4 |
| Key_reads | 1 |
| Key_write_requests | 0 |
| Key_writes | 0 |
+---------------------------+---------+
매뉴얼에서는 일반적으로 캐시를 이용한 쿼리의 비율(히트율, Hit rate)을 99% 이상으로 유지하라고 권장한다. 만약 히트율이 99% 미만이라면 키 캐시를 조금 더 크게 설정하는 것이 좋다. 하지만 32비트 운영체제와 64비트 운영체제 모두 하나의 키 캐시에 4GB 이상의 메모리 공간을 설정할 수 없다. 만약 4GB 이상의 키 캐시를 할당하고 싶다면 기본(Default) 키 캐시 이외에 별도의 명명된(이름이 붙은) 키 캐시 공간을 설정해야 한다. 기본(Default) 키 캐시 공간을 설정하는 파라미터는 "key_buffer_size"다.
key_buffer_size = 4GB
kbuf_board.key_buffer_size = 2GB
kbuf_comment.key_buffer_size = 2GB
위와 같이 설정하면 기본(Default) 키 캐시 4GB와 "kbuf_board"와 "kbuf_comment"라는 이름의 키 캐시가 각각 2GB씩 생성된다. 하지만 기본 키 캐시 이외의 명명된 키 캐시 영역은 아무런 설정을 해주지 않으면 메모리 할당만 해두고 사용하지 않게 된다는 점에 주의해야 한다. 즉, 기본(Default)이 아닌 명명된 추가 키 캐시는 어떤 인덱스를 캐시할지 MySQl(MyISAM 스토리지 엔진)에게 알려줘야 한다. 그럼 명명된 각 키 캐시에 게시판 테이블(board)의 인덱스와 코멘트 테이블(comment)의 인덱스가 캐시되도록 설정해 보자.
CACHE INDEX board IN kbuf_board;
CACHE INDEX comment IN kbuf_comment;
이렇게 설정하면 비로소 board 테이블의 인덱스는 kbuf_board 키 캐시를, comment 테이블의 인덱스는 kbuf_comment 키 캐시를 사용할 수 있다. 나머지 테이블의 인덱스는 예전과 동일하게 기본 키 캐시를 사용한다.
MyISAM 테이블의 인덱스는 키 캐시를 이용해 디스크를 검색하지 않고도 충분히 빠르게 검색할 수 있다. 하지만 MyISAM 테이블의 데이터는 디스크로부터의 I/O를 해결해 줄 만한 어떠한 캐시나 버퍼링 기능이 MyISAM 스토리지 엔진에는 없다. 그래서 MyISAM 테이블의 데이터 읽기나 쓰기 작업은 항상 운영체제의 디스크 읽기 또는 쓰기 작업으로 요청될 수밖에 없다. 물론 대부분의 운영체제는 디스크로부터 읽고 쓰는 파일에 대한 캐시나 버퍼링 메커니즘을 가지고 있기 때문에 MySQL 서버가 요청하는 디스크 읽기 작업을 위해 매번 디스크의 파일을 읽지는 않는다.
운영체제의 캐시 기능은 InnoDB와 같이 데이터의 특성을 알고 전문적으로 캐시나 버퍼링을 하지는 못하지만 그래도 여전히 없는 것보다는 낫다. 운영체제의 캐시 공간은 남는 메모리를 사용하는 것이 기본 원칙이다. 전체 메모리가 8GB인데 MySQL이나 다른 애플리케이션에서 메모리를 모두 사용해 버린다면 운영체제가 캐시 용도로 사용할 수 있는 메모리 공간이 없어져 버린다. 이런 경우에는 MyISAM 테이블의 데이터를 캐시하지 못하게 되며, 결론적으로 MyISAM 테이블에 대한 쿼리 처리가 느려진다. 만약 데이터베이스에서 MyISAM 테이블을 주로 사용하고 있다면 운영체제가 사용할 수 있는 캐시 공간을 위해 충분한 메모리를 비워둬야 이러한 문제를 방지할 수 있다.
MyISAM이 주로 사용되는 MySQL에서 일반적으로 키 캐시는 최대 물리 메모리의 40% 이상을 넘지 않게 설정하고, 나머리 메모리 공간은 운영체제가 자체적인 파일 시스템을 위한 캐시 공간을 마련할 수 있게 해주는 것이 좋다.
참고