[DB] Query Cache ?
목차
- Query Cache란?
- MySQL Query Cache의 문제점
- 대안
Query Cache란?
Query Cache
란 SQL 실행 결과를 메모리에 저장해 둔 것을 의미합니다.
SQL을 수행하면 [Query Parsing] -> [Optimization] -> [Execution] 과정을 거쳐 디스크에서 데이터를 읽습니다.
하지만 Query Cache를 사용하면 이러한 과정을 생략하고 같은 SQL이라면 메모리에서 바로 결과 값을 찾아서 사용할 수 있습니다.
몇 개의 레코드를 찾기 위해 몇 백만개의 레코드를 읽는 무거운 쿼리가 자주 사용된다면 Query Cache로 큰 이점을 얻을 수 있습니다.
MySQL Query Cache의 문제점
MySQL
은 자체적으로 Query Cache 기술을 지원했지만 5.6 버전 부터는 기본적으로 비활성화 되어있고, 5.7 버전을 끝으로 deprecated 되었습니다.
MySQL Query Cahce의 문제점은 크게 3 가지가 있습니다.
- 캐싱된 데이터가 참조하는 테이블에 수정 작업(Insert, Update, Delete)이 발생하면 캐시가 삭제된다.
- 멀티 스레드 환경에서 성능저하가 발생한다.
- SQL에 따라서 캐싱이 되지 않는 경우가 많다.
My SQL Query Cahce는 테이블에 수정 작업이 발생하면 캐시를 삭제합니다. 이때 전혀 관련 없는 데이터의 수정이 일어나도 테이블이 같다면 캐시가 삭제됩니다.
문제는 또 있습니다. 캐시를 삭제할 때 다른 세션(스레드)가 잘못된 데이터를 가져가지 않도록 Query Cache Lock
이라는 이름으로 락킹하고 다른 스레드들은 Waiting for query cahce lock
상태에서 대기 상태에 빠집니다.
수정 쿼리가 많이 발생하는 OLTP 시스템
에서는 수정 쿼리가 발생할 때마다 캐시가 삭제되어 기능을 제대로 사용하지 못합니다. 수정 작업이 없어도 캐시 락 때문에 오히려 성능저하가 발생 할 수 있습니다.
대안
DB 에서 캐싱하는 것이 아니라 Application Layer 에서 별도의 Server Cache
(ex. Memcached, Redis)를 사용하는 것이 대안이 될 수 있을 것 같습니다.Memcached
는 메모리 기반 분산 캐시 서버이고, Redis
는 더 많은 기능을 제공하고 Memecached의 단점을 개선하여 만들어졌습니다.
마무리
Query Cahce라는 기능이 있다는 것은 선임에게 우연히 듣게되어 흥미가 생겨 알아 보았습니다. 알아보다 보니 Server Cache(혹은 메모리 DB)로 해결할 수 있다는 것도 알게 되었습니다.
요즘들어 생각하는 것은 깊이 알진 않아도 박학다식한 것이 중요한 것 같습니다.
문제를 해결하는데 있어서 해결 할 방법을 모르는 것과 해결할 방법을 알지만 사용할 방법을 모르는 것은 굉장히 다르기 때문입니다.
깊게는 알지 못하지만 이러한 것들이 있는 것을 알게 되었다는 것이 문제를 해결하는 동아 줄이 될 수 있을 것 같습니다.