8.9.3.3 쿼리 캐시 구성
have_query_cache
서버 시스템 변수는 쿼리 캐시를 사용할 수 있는지 여부를 나타냅니다.
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
표준 MySQL 바이너리를 사용하는 경우 쿼리 캐시가 비활성화되어있는 경우이 값은 항상 YES
입니다.
다른 몇개의 시스템 변수는 쿼리 캐시 조작을 제어합니다. 이들은 mysqld를 시작할 때 옵션 파일 또는 명령 행에서 설정할 수 있습니다. 쿼리 캐시 시스템 변수 모두 query_cache_
로 시작하는 이름을 가지고 있습니다. 그 내용은 여기에서 제공하는 추가 구성 정보와 함께 섹션 5.1.4 "서버 시스템 변수" 에서 간략하게 설명하고 있습니다.
쿼리 캐시 크기를 설정하려면 query_cache_size
시스템 변수를 설정합니다. 그것을 0으로 설정하면 query_cache_type=0
을 설정하는 것과 마찬가지로, 쿼리 캐시가 비활성화됩니다. 기본적으로 쿼리 캐시는 비활성화됩니다. 이것은 1M 기본 크기와 0의 query_cache_type
기본값을 사용하여 수행됩니다. (MySQL 5.6.8 이전에서는 1의 기본 query_cache_type
에서 기본 크기는 0입니다.)
오버 헤드를 크게 절감하려면 쿼리 캐시를 사용하지 않는 경우에 query_cache_type=0
에서 서버를 시작합니다.
Windows Configuration Wizard를 사용하여 MySQL을 설치하거나 구성 할 경우, query_cache_size
의 기본값이 사용 가능한 다양한 구성의 종류에 따라 자동으로 구성됩니다. Windows Configuration Wizard를 사용하는 경우 선택한 구성에 대한 쿼리 캐시가 활성화된다 (즉 0이 아닌 값으로 설정된다) 수 있습니다. 쿼리 캐시는 query_cache_type
변수의 설정에 의해 제어됩니다. 구성이 이루어진 후에, my.ini
파일에 설정된이 변수의 값을 확인하십시오.
query_cache_size
를 0이 아닌 값으로 설정하는 경우 그 구조를 할당하기 위해 쿼리 캐시에 약 40KB의 최소 크기가 필요하다는 것을 기억하십시오. (정확한 크기는 시스템 아키텍처에 따라 다릅니다.) 너무 작은 값을 설정하면이 예제처럼 경고를받습니다.
mysql>SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected 1 warning (0.00 sec) mysql>SHOW WARNINGS\G
*************************** 1. row ******************** ******* Level : Warning Code : 1282 Message : Query cache failed to set size 39936; new query cache size is 0 mysql>SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec) mysql>SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+ | Variable_name | Value | +------------------+-------+ | query_cache_size | 41984 | +------------------+-------+
쿼리 캐시에서 실제로 쿼리 결과를 유지할 수 있도록하려면 그 크기를 크게 설정해야합니다.
mysql>SET GLOBAL query_cache_size = 1000000;
Query OK, 0 rows affected (0.04 sec) mysql>SHOW VARIABLES LIKE 'query_cache_size';
+------------------+--------+ | Variable_name | Value | +------------------+--------+ | query_cache_size | 999424 | +------------------+--------+ 1 row in set (0.00 sec)
query_cache_size
값은 가장 가까운 1024 바이트 블록으로 조정됩니다. 따라서보고되는 값은 할당 된 값과 다를 수 있습니다.
쿼리 캐시의 크기가 0보다 큰 경우, query_cache_type
변수는 그 동작에 영향을줍니다. 이 변수는 다음 값으로 설정할 수 있습니다.
0
또는OFF
의 값은 캐시 나 캐시 된 결과의 취득을 방해합니다.1
또는ON
값은SELECT SQL_NO_CACHE
로 시작 문장을 제외한 캐시를 사용합니다.2
또는DEMAND
값은SELECT SQL_CACHE
로 시작 문만 캐시시킵니다.
query_cache_size
가 0이면 query_cache_type
변수 0으로 설정하십시오. 이 경우 서버는 쿼리 캐시 상호 배타 락을 전혀 획득하지 않습니다. 이것은 런타임에 쿼리 캐시를 사용할 수 없으며 쿼리 실행의 오버 헤드가 감소되는 것을 의미합니다.
GLOBAL
query_cache_type
값을 설정하면 변경 한 후에 연결된 모든 클라이언트의 쿼리 캐시 동작이 결정됩니다. SESSION
query_cache_type
값을 설정하여 각 클라이언트는 고유의 연결 캐시 동작을 제어 할 수 있습니다. 예를 들어, 클라이언트는 다음과 같이 자신의 쿼리에 대한 쿼리 캐시 사용을 해제 할 수 있습니다.
mysql> SET SESSION query_cache_type = OFF;
서버가 시작될 때 ( SET
문을 사용하여 런타임이 아니라)에 query_cache_type
을 설정하는 경우 숫자 만 허용됩니다.
캐시 가능한 개별 쿼리 결과의 최대 크기를 제어하려면 query_cache_limit
시스템 변수를 설정합니다. 기본값은 1M 바이트입니다.
캐시를 너무 크기로 설정하지 마십시오. 업데이트시 캐시 잠금 스레드의 필요성 때문에 매우 큰 캐시에서 잠금 경합 문제가 볼 수 있습니다.
명령 행 또는 구성 파일에 --maximum-query_cache_size=
옵션을 사용하여 32M
SET
문 실행시 쿼리 캐시에 지정할 수있는 최대 크기를 설정할 수 있습니다.
쿼리가 캐시되도록하면 그 결과 (클라이언트로 전송 된 데이터)가 결과의 취득시에 쿼리 캐시에 저장됩니다. 따라서 데이터는 일반적으로 하나의 큰 묶음으로 처리되지 않습니다. 쿼리 캐시는 필요시이 데이터를 저장하기위한 블록을 할당하기 때문에 하나의 블록이 가득 차면 새로운 블록이 할당됩니다. 메모리 할당 작업 비용 (시간적)이 걸리기 때문에 쿼리 캐시는 query_cache_min_res_unit
시스템 변수에 의해 지정된 최소 크기로 블록을 할당합니다. 쿼리가 실행되면 사용되지 않은 메모리가 해제되도록, 마지막 결과 블록은 실제 데이터 크기로 트리밍됩니다. 서버에서 실행되는 쿼리의 종류에 따라서는 query_cache_min_res_unit
값을 튜닝하는 것이 유효하다고 알 수 있습니다.
query_cache_min_res_unit
의 기본값은 4K 바이트입니다. 대부분의 경우 이것으로 충분하다 것입니다.작은 결과 대량의 쿼리가있는 경우, 다수의 빈 블록에 도시 된 바와 같이 기본 블록 크기는 메모리 조각화가 발생할 수 있습니다. 조각은 메모리 부족으로 인해 쿼리 캐시 캐시에서 쿼리를 강제로 정리 (삭제) 할 수 있습니다. 이 경우
query_cache_min_res_unit
값을 줄입니다. 여유 블록과 가지 치기에 의해 삭제 된 쿼리의 숫자는Qcache_free_blocks
와Qcache_lowmem_prunes
상태 변수의 값에 의해 얻을 수 있습니다.대부분의 쿼리의 결과가 큰 (
Qcache_total_blocks
및Qcache_queries_in_cache
상태 변수를 체크합니다) 경우query_cache_min_res_unit
를 늘려 성능을 향상시킬 수 있습니다. 그러나 크게 초과하지 않도록하십시오 (이전 항목을 참조하십시오).