[MySQL] 쿼리 캐시

신찬규·2024년 4월 6일

MySQL

목록 보기
6/13

같은 데이터에 대해 같은 요청이 반복해서 들어오는 상황에서 같은 작업을 계속해서 실행하는 것은 비효율적일 것이다. 이로 인해 MySQL은 쿼리 캐시라는 것을 사용했다. 쿼리 캐시는 빠른 응답을 필요로 하는 환경에서 매우 중요한 역할을 담당했다. 쿼리 캐시는 SQL의 실행 결과를 캐싱하고, 같은 SQL 쿼리가 실행되면 즉시 결과를 반환하기 때문에 매우 빠른 성능을 보였다.

쿼리 캐시를 사용하기 위해선, 다음과 같은 제약 사항이 있다.

  • 쿼리가 바이트 단위까지 모두 일치해야 한다.
  • 비결정적 기능을 사용하는 경우(RAND(), NOW() 등) 쿼리 캐시는 사용할 수 없다.
  • 쿼리 캐시는 오래된 결과를 제공하지 않는다. 테이블의 데이터가 변경되면 캐시에서 해당 테이블과 관련된 것은 제거된다.
  • 만약 InnoDB를 사용한다면, 캐시에 제약 사항이 있을 수 있다. InnoDB는 동시성 제어 방법으로 MVCC를 사용하는데, 현재 트랜잭션에서 보고 있는 값과 캐시의 값이 다를 수 있다.

이러한 점에 의해 쿼리 캐시는 읽기 전용 연산이 대부분이고, 쿼리의 비용이 비싼 경우 큰 도움이 될 수 있다. 그러나, 테이블의 데이터가 변경되면 캐시의 값과 실제 테이블의 값이 달라지기 때문에 캐시에서 해당 테이블과 관련된 것은 제거해야 한다는 점이 있다. 테이블의 데이터가 계속해서 변하는 환경에서는 이는 심각한 동시 처리 성능 저하를 유발한다. 이로 인해 MySQL 8.0부터는 쿼리 캐시가 완전히 제거되었다. 데이터의 변경이 자주 발생하지 않는 환경은 거의 없기 때문에, 쿼리 캐시가 큰 도움이 안된다는 판단을 했기 때문이다.

참고 자료

profile
느려도 조금씩 꾸준하게

0개의 댓글