MySQL 4.0.1부터 Query Cache라는 기능이 추가되었다.
이것은 최근에 실행된 select질의문과 그 결과를 메모리에 저장하는 기능이다.
자주 사용되는 질의문이라면 query cache로부터 결과값을 바로 불러들이므로 parsing, execution의 부하를 제거할 수 있다.
이때 사용되는 질의는 동일한 질의(identical queries)여야 적용된다.
query cache의 적용사례는 아주 풍부하다고 볼 수 있겠다.
뉴스의 헤드라인을 보여주거나, 게시판의 최근목록을 보여주는 메인페이지에 적용될 수 있다.
(테이블 변동이 자주 발생하지 않고 동일한 질의(identical queres)가 많은 경우)
* 동일한 질의(identical queries)
오라클의 경우가 같다고 생각하면 된다.
예를 들어, select * from test와 Select * from TEST는 대소문자가 다르므로 동일한 질의가 아니다.
1. 모든 문자(대소문자,스페이스,..)가 동일해야 한다.
2. 사용하는 데이터베이스, 통신프로토콜, 캐릭터셋이 동일해야 한다.
데이터가 변경되면, query cache내에 있는 관련된 모든 엔트리들이 flush되어지므로 항상 최신의 데이터를 가지고 있게 된다. 따라서, query cache가 잘못된 데이터(stale data:변경사항이 반영되지 않은 데이터)를 반환하는 경우는 없다.
query cache는 디폴트로 disable(query_cache_size=0)되어 있는데, query cache와 관련된 변수는 다음과 같다.
보통 query_cache_size변수값만 설정해주고, 나머지 변수들은 디폴트로 두면 된다.
query_cache_limit : 저장가능한 최대 results크기(디폴트:1M) 보통 query_cache_size의 1~10%정도 설정
query_cache_size : results를 저장하기 위해 메모리 할당량. 0으로 지정하면 query cache를 disable함
query_cache_type : 0(OFF) : results를 캐쉬하거나 retrieve하지 않음.
1(ON) : select sql_no_cache.. 쿼리를 제외한 모든 results를 캐쉬
2(DEMAND): select sql_cache... 쿼리만 캐쉬
설정파일
Unix: /etc/my.cnf
윈도: c:\winnt\my.ini(windows 2000인 경우)
설정예
query_cache_size = 0 (disable)
query_cache_size = 512K (512 Kbytes)
query_cache_size = 10M (10 Mbytes)
Query Cache와 관련된 명령어
flush query cache : query cache를 defragment
reset query cache : query cache를 clear
flush tables : query cache를 flush
show status : query cache 성능 모니터링
show status로 나온 변수중 query cache와 관련된 변수와 설명은 다음과 같다.
Qcache_queries_in_cache : 캐쉬내 등록된 쿼리수
Qcache_inserts : 캐쉬에 추가된 쿼리수
Qcache_hits : 캐쉬 히트수
Qcache_lowmem_prunes : 메모리부족으로 인해 캐쉬로부터 삭제된 쿼리수
Qcache_not_cached : 캐쉬되어지지 않은 쿼리수(query_cache_type으로 인한 경우나 캐쉬될수 없는 것일 경우)
Qcache_free_memory : query cache의 free 메모리량
Qcache_total_blocks : query cache가 가진 총블럭수
Qcache_free_blocks : query cache가 가진 free 메모리 블럭수
총 쿼리수 = Qcache_inserts + Qcache_hits + Qcache_not_cached
Qcache_lowmem_prunes 변수값이 크다면 query cache 메모리가 부족하다는 의미이므로 query_cache_size를 늘여줄 필요가 있다.
query cache 되지 않는 경우
1. 질의가 다음의 함수를 포함할때
User-Defined Functions
CONNECTION_ID
FOUND_ROWS
GET_LOCK
RELEASE_LOCK
LOAD_FILE
MASTER_POS_WAIT
NOW
SYSDATE
CURRENT_TIMESTAMP
CURDATE
CURRENT_DATE
CURTIME
CURRENT_TIME
DATABASE
ENCRYPT (with one parameter)
LAST_INSERT_ID
RAND
UNIX_TIMESTAMP (without parameters)
USER
BENCHMARK
2. mysql system database에 참조하거나 user variable을 포함할때
3. select ... in share mode이거나 select * from autoincrement_field is null 형태일때