MySQL 서버에서 쿼리 캐시(Query Cache)는 빠른 응답을 필요로 하는 웹 기반의 응용 프로그램에서 매우 중요한 역할을 담당했다.
쿼리 캐시는 SQL의 실행 결과를 메모리에 캐시하고, 동일 SQL 쿼리가 실행되면 테이블을 읽지 않고 즉시 결과를 반환하기 때문에 매우 빠른 성능을 보였다.
하지만 쿼리 캐시는 테이블의 데이터가 변경되면 캐시에 저장된 결과 중에서 변경된 테이블과 관련된 것들은 모두 삭제(Invalidate)해야 했다.
이는 심각한 동시 처리 성능 저하를 유발한다.
또한 MySQL 서버가 발전하 면서 성능이 개선되는 과정에서 쿼리 캐시는 계속된 동시 처리 성능 저하와 많은 버그의 원인이 되기도 했다.
결국 MySQL 8.0으로 올라오면서 쿼리 캐시는 MySQL 서버의 기능에서 완전히 제거되고, 관련된 시스템 변수도 모두 제거됐다. MySQL 서버의 쿼리 캐시 기능은 아주 독특한 환경(데이터 변경은 거의 없고 읽기만 하는 서비스)에서는 매우 훌륭한 기능이지만 이런 요건을 가진 서비스는 흔치 않다. 실제 쿼리 캐시 기능이 큰 도움이 됐던 서비스는 거의 없었다.
이 같은 이유로 MySQL 서버에서 쿼리 캐시를 제거한 것은 좋은 선택이라고 생각한다. 실제로 큰 도움은 되지 않지만 수많은 버그의 원인으로 지목되는 경우가 많았기 때문이다.
"Real MySQL 8.0 (1권)"중에서
mysql 쿼리 캐시에 대해서 알려줘
MySQL의 쿼리 캐시는 SQL의 SELECT 문 결과를 저장하고 재사용하는 기능을 가진다. 동일한 SELECT 쿼리가 다시 실행되면, MySQL 서버는 쿼리의 결과를 캐시에서 빠르게 가져올 수 있다. 이를 통해 실제 데이터를 다시 계산하거나 디스크에서 읽어올 필요 없이 데이터를 즉시 제공할 수 있다.
쿼리 캐시는 MySQL의 성능을 향상시키는 데 특히 유용하다. 특히, 웹 사이트와 같이 동일한 데이터를 반복적으로 요청하는 읽기 중심의 애플리케이션에서 매우 효과적이다. 그러나 이 기능은 쓰기가 많은 애플리케이션에서는 반대의 효과를 낼 수 있다. 쿼리 캐시는 테이블의 데이터가 변경될 때마다 무효화되므로, 쓰기가 많은 애플리케이션에서는 캐시 무효화로 인한 오버헤드가 성능 저하를 초래할 수 있다.
MySQL 서버에서 쿼리 캐시를 사용하려면, 쿼리 캐시의 크기를 설정해야 한다. 설정된 크기는 쿼리 결과를 저장하는 데 사용되며, 이 크기가 클수록 더 많은 쿼리 결과를 캐시할 수 있다. 또한, MySQL 서버를 재시작할 때마다 쿼리 캐시가 초기화된다는 점을 유의해야 한다.
아래는 쿼리 캐시를 활성화하고 크기를 설정하는 방법의 예이다:
SET GLOBAL query_cache_size = 1000000;
SET GLOBAL query_cache_type = 1;
위의 첫 번째 명령은 쿼리 캐시 크기를 1MB로 설정하고, 두 번째 명령은 쿼리 캐시를 활성화한다.
MySQL 8.0 이후로 쿼리 캐시는 삭제되었다는 것을 주의해야 합니다. 이는 쿼리 캐시의 성능에 대한 지속적인 우려와 관련이 있으며, 이에 따라 MySQL은 대안적인 성능 최적화 기법을 제안하고 있다.