2010년 6월 4일 금요일

쿼리캐쉬로 성능개선2

[쿼리 캐쉬 설정의 확인]
mysql> SHOW VARIABLES LIKE 'query_cache_%';

[쿼 리 캐쉬에 할당되는 메모리양]
쿼리캐쉬에 할당되어지는 메모리의 최대양은 설정 파일인 my.cnf또는 my.ini의 query_cache_size옵션에 지정된 양이 된다. 기본값은 0으로 쿼리캐쉬용 메모리는 확보되지 않는다. 예> query_cache_size=16M

[쿼리 캐쉬의 블록 사이즈]
쿼리캐쉬의 메모리 영역은 블록으로 관리되지만 블록 사이즈는 변경가능하다.
LRU (Least Recently Used) 알고리즘을 사용해서 캐쉬에 남길 쿼리를 결정한다.
기본값은 query_cache_min_res_unit으로 4KB로 설정되어 있다.

[기억되는 쿼리 결과의 최대값]
query_cache_limit 은 캐쉬하는 쿼리 결과의 최대값이다. 여기에서 설정된 사이즈이상의 결과는 캐쉬되지 않는다. 기본값은 1MB이다.

[쿼리캐쉬의 동작스위치]
query_cache_type옵션에 값을 지정하는 것으로 쿼리캐쉬의 유효등 지정이 가능하다.
0 또는 OFF : 쿼리캐쉬를 사용하지 않음. 기본값
1 또는 ON: 쿼리캐쉬사용. SELECT SQL_NO_CACHE로 된 쿼리만이 캐쉬되지 않는다.
2 또는 DEMAND: 쿼리캐쉬사용. SELECT SQL_CACHE로 된 쿼리만 캐쉬된다.

[Write Lock이 걸렸을 경우 쿼리캐쉬]
MyISAM의 경우 , 어떤 클라이언트(C1)가 어떤 테이블(T1)에 Write Lock를 걸고 있는 경우에 다른 클라이언트(C2)가 쿼리캐쉬로부터 T1에 대한 SELECT결과를 취득할 수 있다.(기본동작)

C1이 T1을 변경하고 있는 중에 C2가 캐쉬되어 있는 T1내용을 읽어 들일 수 있다는 것은 같은 테이블임에도 읽어들여지는 값이 각 클라이언트마다 달라질 수 있다는 것을 의미한다.
query_cache_wlock_invalidate를 1로 하면 lock걸린 MyISAM테이블 캐쉬는 파기된다. C2는 C1갱신이 끝나고나서야 T1에 접속할 수 있다.

[쿼리 캐쉬 사용상황]
mysql> SHOW STATUS LIKE 'Qcache%';

[메모리영역의 fragmentation의 개선]
메모리 효율을 향상 시키기 위해서는 다음과 같은 조작으로 메모리영역의 fragmentation을 개선할 수 있다. 기억되어 있는 쿼리가 삭제되는 것은 아니다.
mysql> FLUSH QUERY CACHE;

[캐쉬의 삭제]
캐쉬되어 있는 내용을 전부 삭제하고 픈 경우에는 다음과 같이 조작한다.
mysql> RESET QUERY CACHE;