[MySQL] MySQL의 Query Cache에 대해서

2022. 9. 12. 22:45카테고리 없음

728x90
반응형

개요

  • MySQL 내부에도 일부 성능 향상을 위해서 cache를 내부적으로 사용하고 있다.
  • 크게 Query Cache와 Buffer Pool Cache를 사용하고 있으며 이 중에서 Query Cache에 대해서 알아보도록 하자.
  • 해당 Query Cache는 MySQL 5.7.20에 Deprecated 되었고, 8.0에서 제거되었는데, 그 이유에 대해서도 알아보자.
  • 본문에 대한 내용은 InnoDB의 Cache를 다루고 있고, 일부 사용하는 DBMS에 따라 달라질 수 있다.

Query Cache

Query Cache란? (해당 Query Cache는 MySQL 5.7.20에 Deprecated 되었다.)

Query Cache는 말 그대로 쿼리의 결과를 저장하여 그 즉시 반환한다.
이에 따라 index를 사용하지 않는 구문의 경우에도 이미 캐싱되면 빠르게 결과를 반환할 수 있다.

설정

Query Cache와 관련된 설정은 아래와 같다.

SHOW VARIABLES LIKE '%query_cache%';

-- have_query_cache: mysqld에서 query cache를 지원하는지 여부
-- query_cache_limit: 해당 limit보다 큰 결과값인 경우 query cache에 저장하지 않는다.
-- query_cache_min_res_unit: query cache를 저장할 때, minimum size 
-- query_cache_size: query cache 결과를 저장할 사이즈
-- query_cache_type: query cache의 type ON, OFF, DEMAND가 있다.
-- query_cache_wlock_invalidate : MyISAM 관련 설정, wlock이 걸릴 경우 해당 테이블과 관련된 query cache를 invalidate하는 설정이다.

기본적으로 query_cache_type의 설정에 의존하지만 쿼리 자체에 관련 힌트를 넣어줄 수도 있다. 의도적으로 쿼리 캐시에 결과를 담게 안하려면 아래와 같이 SQL_NO_CACHE 힌트를 넣어주면 된다.

-- 캐시를 수행하지 않도록 함
SELECT SQL_NO_CACHE * FROM employee;

-- 캐시를 수행할 수 있게 함, query_cache_type이 DEMAND일 때, 의미가 있다.
SELECT SQL_CACHE * FROM employee;

제약사항

  • 쿼리 캐시를 타려면 쿼리문 자체도 정확히 일치해야 한다. (대소문자, 공백 등등을 모두 구분한다. - 파싱을 피하기 위한 것이라고 한다.)
  • multi core machine에서 scale out에 자유롭지 않다.

왜 disabled되었는가?

아래 아티클에서 그 내용을 찾아볼 수 있다.

  1. tracking-mutex-locks-in-a-process-list-mysql-55s-performance_schema
  2. mysql-8-0-retiring-support-for-the-query-cache

1. Query Cache 기능이 Multi core machine에서 성능 향상이 잘 이루지지 않고, 오히려 저해되는 문제가 발생한다.

  • 위의 블로그에서는 Query Cache Mutex를 가져오려고 할 떄, 많은 경합이 발생한다고 설명하고 있다.

2. 최적화와 Query Cache 기능 개선 사이에서의 고민

  • 두 개의 기능 자체는 독립적으로 개발이 가능하다.
  • 하지만 개발 리소스는 제한적이기 떄문에 선택을 하기로 결정
  • 이에 따라서 좀 더 범용적으로 적용 가능한 최적화를 수행하는 형태로 선택과 집중을 하기로 결정

Buffer Pool Cache

참고 링크

728x90
반응형