코드프레소 백엔드 개발자 양성 과정
쿼리 캐시
구글이나 네이버의 인기 검색어 순위가 방증하듯, 무수한 인터넷 이용자와 무궁무진한 검색어 조합에 비해 사람들의 관심사는 특정 소재에 몰리기 쉽상이다. 요즘의 경우, 코로나 바이러스에 관련된 조회문이 자주 호출될 것을 아는 상황이라면, 검색 포털은 그것들을 캐시 메모리에 미리 올려두어 지연 시간을 줄일 수 있다. 이런 캐시 기술이 MySQL에서 어떻게 작동하는지 살펴보자.
쿼리 캐시란?
쿼리 캐시는 SELECT
명령문의 내용과 그 명령문으로 불러들인 결과를 저장하는 임시 저장소이다. 같은 쿼리가 다시 들어온다면, 서버는 명령문을 처음부터 수행하지 않고 쿼리 캐시로부터 가져온다. 이는 정보가 자주 바뀌지 않는 테이블에서나, 같은 쿼리문이 반복되어 요청될 때 유용하다. 관련 테이블에 변경 사항이 있을 경우, 쿼리 캐시에서 그 변경 사항과 관련이 있는 기록들은 삭제된다.
작동 방법
클라이언트로부터 들어오는 모든 조회문은 쿼리 캐시에 저장된 조회문과 비교되어 같은 명령인지 판단된다. 쿼리문은 바이트 단위로 정확히 일치해야만 같은 쿼리로 인식된다. 예를 들면, 대소문자 구분을 약간씩만 바꾼 아래 세 명령문은 모두 달리 인식된다.
SELECT * FROM table_name;Select * From table_name;select * from table_name;
또한 문자열은 완전히 일치하는 쿼리문이라도 데이터베이스에 따라, 프로토콜 버전에 따라, 기본 인코딩 설정에 따라 다른 쿼리로 인식되어 다른 캐시에 저장될 수 있다.
쿼리 캐시는 부모 쿼리 아래 담긴 서브쿼리나, 사용자 지정 함수나 트리거에 포함된 쿼리를 저장하지 않는다. 뷰에 대한 조회 기록은 쿼리 캐시에 담긴다.
MySQL 5.7에서는 SELECT
문을 사용할 때, 쿼리 캐시와 관련된 다음 두 가지 명령을 명시할 수 있다.
SELECT SQL_CACHE * FROM table_name;SELECT SQL_NO_CACHE * FROM table_name;
SQL_CACHE
테이블에서 모든 자료를 조회하는데, 이 명령문과 조회 결과를 쿼리 캐시에 저장하겠다고 명령한다.
SQL_NO_CACHE
테이블에서 모든 자료를 조회하는데 쿼리 캐시를 사용하지 않겠다고 선언한다. 즉, 조회할 때 쿼리 캐시에 정보가 이미 담겨있는지 확인을 하지 않을 뿐만 아니라, 조회된 결과와 명령문을 저장하지도 않겠다는 뜻이다.
설정 방법
MySQL 5.7에서는 시스템 변수 query_cache_size
를 조작해 쿼리 캐시 용량을 조정해줄 수 있다.
SET GLOBAL query_cache_size = 설정하고자 하는 캐시 용량을 바이트 단위로 입력;
쿼리 캐시 용량의 하한선은 40KB이다. 39936 바이트로 지정 시 오류가 발생한다. SHOW VARIABLES
명령문으로는 설정된 쿼리 캐시 용량을 확인할 수 있다.
query_cache_type
문을 통해 쿼리 캐시 기능을 켜고 끄거나 자동화할 수도 있다.
query_cache_type=0
쿼리 캐시 사용을 끈다. 쿼리 캐시에서 정보를 가져오지도 않고 저장하지도 않는다.
query_cache_type=1
쿼리 캐시 사용을 자동으로 켠다. SELECT SQL_NO_CACHE
로 설정된 명령문에만 쿼리 캐시를 사용하지 않는다.
query_cache_type=2
쿼리 캐시 사용을 수동으로 켠다. SELECT SQL_CACHE
를 명시적으로 사용하는 명령문에 대해서만 쿼리 캐시를 적용한다.
이와 같은 기능들은 MySQL이 8.0 버전으로 넘어가며 다수 소멸되었으므로 버전에 맞춰 설정해 주어야 캐시 기능을 차질 없이 이용할 수 있다.