MySQL의 쿼리 캐시 메커니즘 []

MySQL의 쿼리 캐시에 대해

쿼리 캐시, 쿼리 해결 과정을 연 후 :
쿼리 캐시가 설정되어있는 경우, 쿼리를 구문 분석하기 전에, 다음 MySQL은 쿼리 쿼리 데이터 캐시 적중 여부를 확인하기 위해 우선 순위를 부여합니다. 현재 쿼리는 쿼리 결과를 반환하기 전에 쿼리 캐시, MySQL의 검사 사용자 권한을 칠 발생합니다. 권한 문제가 아닌 경우, MySQL은, 다른 모든 단계 (구문 분석, 최적화, 실행 등)을 건너 뜁니다 캐시에서 직접 결과를 얻을 수 및 클라이언트에 반환 할 수 있습니다. 이 경우, 쿼리 실행 계획없이 해결되지 않습니다, 실행되지 않습니다.

오픈 쿼리 캐시의 MySQL 서버, MySQL 서버는 쿼리에 의해 계산 된 각 SELECT 문받은 해시 값은 해시 알고리즘을 지정합니다 때, 값은 쿼리 캐시에 일치하도록 하시.

  • 일치하는 항목이 없을 경우이 해시 값은 해시 목록에 저장되고, 쿼리 결과 집합은 각 노드가 캐시에 주소를 해당 해시 값 목록 하시 Quey 저장된 결과 집합을 저장, 캐시에 저장되고, 쿼리 또한 테이블의 정보 중 일부에 관한 것이다;
  • 쿼리에 의해 동일한 해시 값과 일치 직접 캐시 쿼리 결과에 해당하는 경우 클라이언트에 반환 설정합니다.

현재 MySQL의 쿼리 캐시는 문이 쿼리 캐시를 적용하기 전에, 저장소에 키 각 SQL 텍스트를 기반으로 MySQL의 쿼리 캐시 캐시하지 않습니다 사용 선택 문, 기타 유사한 쇼를 캐시합니다, SQL 텍스트는하지 않을 것이다 처리. 심지어 한 문자의 차이만큼 즉, 두 개의 SQL 문에서, 다음 두 SQL 캐시가 다른 주소를 사용합니다 (예를 들어, 경우 같은, 하나 개 더 많은 공간, 더 많은 의견 없음). 예를 들면 : 그 결과는 동일하지만 다음 세 가지 SQL은 세 가지 다른 캐시에 저장됩니다. * 이름 선택은 = 사람의 FROM 'surfchen'; SELECT * WHERE 사람들 / FROM 안녕하세요 ~ / 이름 = 'surfchen'; 사람들하여 SELECT * 이름 = WHERE 'surfchen';

MySQL의 캐싱 메커니즘

MySQL의 캐싱은 단순히 같은 SQL을 실행하면, 서버는 SQL을 분석하고 실행 갈 필요없이 캐시에서 직접 결과를 얻을 수, 쿼리 결과는 SQL 텍스트를 캐싱을 의미합니다. 테이블이 변경되면, 더 이상 유효하지 않습니다 캐시 된 모든 쿼리의 테이블을 사용, 캐시의 관련 항목의 값이 비워 쿼리합니다. 변화는 여기에서 MERGE를 사용하여 쿼리 테이블 매핑 테이블에 그 변경 사항을 포함 DELETE INSERT, UPDATE, TRUNCATE, ALTER TABLE, DROP TABLE DROP 데이터베이스 등을 포함한 모든 데이터 구조 또는 테이블의 변화를 의미한다. 물론,이 자주 테이블에 업데이트됩니다, 쿼리 캐시가 적합하지 않습니다,하지만 일부 자주 변경 데이터 테이블과 같은 SQL 쿼리를 많이가, 쿼리 캐시는 뛰어난 성능을 절약 할 수 있습니다.

이 같은 간주 될 수 있습니다 쿼리는 정확히 같은 (동일한 바이트 단위)해야합니다. 또한, 다른 이유로 동일한 쿼리 문자열은 다른 것으로 간주 할 수있다. 다른 데이터베이스, 서로 다른 프로토콜 버전, 또는 다른 기본 문자 집합 다른 쿼리를 고려하고 쿼리 캐시를 사용합니다.

캐시 규칙

캐시를 개설, MySQL 서버가 자동으로 쿼리 및 반환 후 결과 메모리에 설정하고, 메모리에서 직접 촬영 한 다음 시간을 확인합니다;

결과 캐시는 클라이언트의 캐시 쿼리 결과, 그래서 다른 클라이언트를 사용할 수 있습니다, 세션에서 공유;

MySQL의 쿼리 캐시 결과의 내용을 선택 세트는 키로서 전체 SQL 문자열을 사용, 민감한, 공간 등의 경우이다 캐시합니다. 즉, 두 개의 SQL 캐시 히트로 이어질 것입니다 동일해야합니다. 즉, 정확하게, 쿼리 캐시가 다른 쿼리로 간주됩니다 약간의 다른를 대문자와 소문자만큼,에서 오는 또는 의견 고객의 문의를 사용하는 것입니다, 어떤 치료를하지 않을 쿼리 캐시, SQL에 MySQL 서버를 확인하는 것입니다;

준비된 문장은, 경우에도 정확히 같은 매개 변수를 결과를 캐시하지 않습니다. 5.1 이후 개선 될 것입니다.

여기서 조건 함수가 지금 등등, 같은 CURRENT_DATE로, 더 불확실하지 않습니다 캐시를 ​​포함하지 않기 때문에.

반환이 시간 또는 일의 수준에 따라 경우 기능 날짜, 그것은 다시 전송 내부를 해결하는 것이 가장 좋습니다.

결과 세트 캐시의 많은되지 않습니다 (<에는 query_cache_limit)

서브 - 서브 테이블 환경에서 MySQL 데이터베이스 캐시는 일을하지 않습니다

SQL 사용자 정의 함수의 구현을 트리거가 있으며, MySQL은 또한 캐시가 작동하지 않습니다

수동으로 캐시를 지우

수동으로 다음과 같은 세 가지 SQL을 사용할 수있는 캐시를 지우 :

  • FLUSH 쿼리 캐시, 쿼리 캐시 메모리 조각화해서 # 청소
  • QUERY CACHE를 RESET # 쿼리 캐시에서 모든 쿼리를 제거
  • FLUSH TABLES # 열려있는 모든 테이블, 쿼리 캐시를 삭제합니다이 작업
캐시 메모리 관리 메커니즘

오히려 운영 시스템을 통해보다 메모리 할당을 관리하고 해제, 기술을 사용하여 MySQL의 쿼리 캐시 메모리 풀. 메모리 풀의 기본 단위는 가변 길이의 블록에 의해 사용되는 정보의 종류, 크기, 데이터 등을 저장하는데 사용되며, 함께 캐시 블록 문자열하여 결과 집합이리스트. 최소 블록 길이 query_cache_min_res_unit이다.

서버가 시작되면, 필요한 메모리 캐시는 완벽한 자유 블록 초기화합니다. 때 캐시 쿼리 결과에 대한 필요성, 그는 공간을 할당하기 시작하지 않을 경우이 시간에,하는 작은 캐시 데이터, 애플리케이션 데이터 블록이 경우에도, 응용 프로그램 데이터 블록 공간 매개 변수 query_cache_min_res_unit 구성에서 무료 블록 때문에 쿼리 반환 결과 시작 얼마나 많은 결과를 예측하고있다.

당신이 작업이 느리다 있도록 블록을 잠글 필요가 메모리 공간의 블록을 할당, MySQL은 여분의 전체 버전을 저장할 때 예비가있는 경우, 계속 적용하지 않을 경우,이 작업을하지 않도록 가능한 한 작은 메모리 블록을 선택하려고합니다.

그러나, 동시에 동작하는 경우, 남은 공간을 재활용 할 필요성이 매우 작고, 덜 query_cache_min_res_unit보다 단편을 생성한다, 다시 사용될 수 없다.

하지 적용

큰 캐시 캐시 미스가 있지만, 사실은 쿼리의 대부분이 서버에 캐시하는 경우 다음과 같은 사항이 발생해야합니다 :

  • 쿼리 캐시는 MySQL은 쿼리 결과를 캐시에 기회가 없습니다, 아직 완료 워밍업입니다하지 않습니다.
  • 전에 쿼리가 실행 된 적이 없다. 응용 프로그램이 워밍업이 완료된 경우에도 쿼리를 실행 반복하지 않는 경우 여전히 캐시 미스가 많이있을 것입니다.
  • 캐시 무효화 작업이 너무 많이 캐시 조각화, 메모리 부족, 데이터 수정은 캐시 미스의 원인이됩니다. * 수정 데이터는 또한 메모리 부족으로 인해 발생 횟수 Qcache_lowmem_prunes 오류로 볼 수있다 (Com_update 등, Com_delete 포함) 파라미터 COM_ 사정을 통해 볼 수있다.

테이블에 데이터를 기록 할 때, 테이블이 작업은 글로벌 잠금 조작으로하기 때문에, 캐시 공간이 큰 경우, 소비는 일정 시간 동안 시스템이 죽은 만들 수 있습니다, 좋은 것, 실패로 설정되어 캐시을 모두해야합니다 보호.

트랜잭션이 커밋 될 때까지 너무 오래, 트랜잭션 커밋하기 전에, 모든 쿼리 캐시를 사용할 수 없습니다, 테이블을 수정할 때 InnoDB 테이블은 캐시 무효화를 설정하지만, 이러한 특성의 여러 버전이 일시적으로 다른 문제 실드를 수정합니다 거래 시간은 크게 쿼리 캐시 히트를 줄일 수 있습니다.

MySQL의 쿼리 캐시 파편 최적화

그림 삽입 설명 여기

MySQL의 쿼리 캐시의 장점과 단점

장점 :
쿼리 캐시 쿼리 권한을 확인하기 위해 질의 후 SQL 구문 분석 및 쿼리하기 전에 클라이언트에서 쿼리 요청을 수신 MySQL의에서 일어났다. 그 후, MySQL 클라이언트 쿼리 SQL을받은 후, 그냥 ... 적절한 권한을 검증 할 필요가 결과 쿼리 캐시를 찾을 수있을 것입니다, 당신은 더 많은 최적화 모듈 후 계획의 구현을 최적화하고 분석 할 필요가 없습니다 상호 작용 스토리지 엔진이 발생 할 필요가 없습니다. 쿼리가 캐시 메모리를 기반으로하므로, 따라서 매우 높은 효율 결과는 I / O 및 CPU 컴퓨팅 디스크의 양을 줄이는 결과를 해당 메모리로부터 직접 반환.

단점 :

해시 및 해시 계산 소비를 가져다 자원을 찾기 쿼리합니다. query_cache_size를 세트 1 (즉, ON)으로하면, MySQL은 각각 SELECT 유형의 쿼리 해시 계산을받은 것입니다, 다음이 쿼리가 존재의 캐시 결과를 찾습니다. 해시 계산과 검색의 효율성이 충분히 높은이지만, 오버 헤드에서 발생하는 쿼리는 무시 될 수 있지만 높은 동시성에 올 때, 쿼리의 수천, 해시 계산이있다 및 조회 오버 헤드 가져 그것은 심각하게주의해야합니다.

쿼리 캐시 실패 문제. 당신이 더 자주 테이블을 변경하는 경우 쿼리 캐시 실패율이 매우 높은에 발생합니다. 뿐만 아니라, 상기 테이블 구조, 또는 지수의 변화를 포함하고, 상기 변경 데이터 테이블에 나타난 변화를 의미한다.

다른 쿼리하지만 쿼리 같은 쿼리 결과 캐시, 이것은 메모리 자원의 과도한 소비가 발생합니다. (자신의 해시 값이 다르기 때문에) 쿼리 문자의 경우, 서로 다른 공간이나 의견은, 쿼리 캐시는 다른 쿼리를 간주됩니다.
관련 시스템 변수는 메모리 조각화가 많이 발생합니다 무리한 설정되고,이 쿼리 캐시 메모리까지 자주 청소로 이어질 것입니다.

쿼리 캐시 방법을 사용하도록 설정

세 가지 방법으로 열어 쿼리 캐시를 엽니 다 query_cache_size를 변수를 사용합니다 :

ON : 정상 캐시. SQL_NO_CACHE 또는 다른 비 결정적 기능, 일반적으로 캐시 된 쿼리 결과를 지정하지 않은 경우는 SELECT 문을 사용하여 쿼리 말했다.

수요 : 전용 캐시를 지정 SQL_CACHE. 쿼리를 사용하여 SELECT 성명에서 말했다, 당신은 단지 쿼리 결과 SELECT 문 아래로 SELECT 명령문 캐시에 SQL_CACHE을 지정해야합니다 :

select SQL_CACHE name from user where id = 15; #只有明确指定 SQL_CACHE 的SELECT语句,才会将查询结果缓存。

OFF : 쿼리 캐시.

효과는 즉시 서비스의 실패를 다시 시작
mysql> set global query_cache_type=1;

my.cnf 파일은, query_cache_size를이 = OFF가 시작 MySQL의 서비스 후, MySQL의 명령 줄에서 쿼리 캐시를 열려면 위의 문을 사용하면 오류가 발생합니다 :

ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it

이 경우, 쿼리 캐시는 MySQL의 명령 줄에서 열려 있지, 당신은 my.cnf 파일의 query_cache_size를 = ON을 수정 한 다음 MySQL의 서비스를 다시 시작해야합니다.

퍼머넌트

my.cnf 파일을 수정합니다 :

query_cache_type = ON

다시 시작 MySQL의 서비스

쿼리 캐시 크기를 설정
query_cache_size :查询缓存的总体可用空间。

만약 query_cache_type을 = 0, 당신이 query_cache_size를 = ON을 설정 한 경우에도, 쿼리 캐시는 여전히 일을 할 수 있음.

효과는 즉시 서비스의 실패를 다시 시작

mysql> set global query_cache_size=536870912;   #单位为字节,必须为1024的倍数。

영구
수정 my.cnf의 :

query_cache_size = 500M   #支持单位:K,M,G
쿼리 캐시 관련 파라미터

기능을 캐싱과 관련된 서버 변수 :

mysql> SHOW GLOBAL VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES     |      
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_strip_comments   | OFF      |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

변수 설명 :

have_query_cache : MySQL 서버가 쿼리 캐시를 지원하는지 여부.

는 query_cache_limit : MySQL은 최대의 결과를 캐시 할 수 있습니다, 결과가이 값보다 큰 경우 쿼리의 크기, 그것은 캐시되지 않습니다;

query_cache_min_res_unit : 캐시 할당 (바이트) 쿼리 최소 블록 크기. 기본값은 4096 (4킬로바이트)입니다. 쿼리, MySQL은 쿼리 캐시에 쿼리 결과를 저장하지만, 할 때 결과가 때때로 그렇게하지 저장하면서, 더 query_cache_min_res_unit의 값, 검색 결과의 측면이 시간 MySQL을보다 상대적으로 큰 결과를 저장하려면 하여, 이러한 블록의 재분배 한 후, 사용 후 충분하지 않은 경우, 재분배 블록을 한번 모든 저장된 결국 결과 얻어진하지만 query_cache_min_res_unit 메모리 공간의 각 할당 결과 집합을 저장할 말하자면 이러한 푸시, 그것은 쿼리, 다수의 메모리 할당을 운영하는 MySQL은 가능하다. 결과는 더 큰 resule의 일부를 경우 적절한 규제 query_cache_min_res_unit 쿼리 결과는 몇 가지 작은 결과 인 경우, 기본 query_cache_min_res_unit가 메모리 조각화 많은 양의가 발생할 수 메모리를 최적화 할 수 있습니다, 당신은 적절한 톤 query_cache_min_res_unit를 넣을 수 있습니다

(query_cache_type을-Qcache_free_memory) / Qcache_queries_in_cache : 평균 단일 쿼리 캐시 크기를 계산

query_cache_type을 : 쿼리가 바이트 가능한 버퍼 공간을 총; 1024의 배수 여야합니다;

query_cache_strip_comments : 쿼리 캐시에서 SQL 쿼리 문을 열쇠로 저장할지 여부를 제어 할 수있는 코멘트 섹션을 제거한 후.

query_cache_size를 : 유형의 쿼리 캐시, 캐시 기능은 세 가지 방법으로 설정되어, 켜져 {| OFF | ON DEMAND};

query_cache_wlock_invalidate : 테이블이 기본적으로 해제, 캐시에 데이터를 반환 할 것인지, 잠겨 있으면, 그것은 또한 좋습니다. 쿼리 캐시에서 쿼리 결과가, 다른 클라이언트가 잠겨 있지 않은 경우 일반적으로 MyISAM 테이블에 클라이언트 WRITE 잠금, 당신은 테이블을 조회 할 수 있습니다 때. 이 변수를 1로 설정하면 쿼리 캐시에있는 테이블에 대한 모든 쿼리가 무효화 그래서, 테이블에 잠금을 작성할 수 있습니다. 그래서 잠금이 적용되는 경우, 강제 할 수있는 다른 클라이언트는 말을 기다리는 테이블에 액세스를 시도합니다.

캐시와 관련된 상태 변수
mysql> SHOW  GLOBAL STATUS  LIKE  'Qcache%';
+-------------------------+----------+
| Variable_name            | Value   |
+-------------------------+----------+
| Qcache_free_blocks       | 1       | #查询缓存中的空闲块
| Qcache_free_memory       | 16759656| #查询缓存中尚未使用的空闲内存空间
| Qcache_hits              | 16      | #缓存命中次数
| Qcache_inserts           | 71      | #向查询缓存中添加缓存记录的条数
| Qcache_lowmem_prunes     | 0       | #表示因缓存满了而不得不清理部分缓存以存储新的缓存,这样操作的次数。若此数值过大,则表示缓存空间太小了。
| Qcache_not_cached        | 57      | #没能被缓存的次数
| Qcache_queries_in_cache  | 0       | #此时仍留在查询缓存的缓存个数
| Qcache_total_blocks      | 1       | #共分配出去的块数
+-------------------------+----------+
캐시의 히트 율을 계산
mysql> SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Com_select';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| Com_select    | 279292490 | #非缓存查询次数
| Qcache_hits   | 307366973 | # 缓存命中次数
+---------------+-----------

캐시 히트 율 :해서 qcache_hits / (해서 qcache_hits + Com_select가)

"히트 및 쓰기"비율
mysql> SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Qcache_inserts';
+----------------+-----------+
| Variable_name  | Value     |
+----------------+-----------+
| Qcache_hits | 307416113    | #缓存命中次数
| Qcache_inserts | 108873957 | #向查询缓存中添加缓存记录的条数
+----------------+-----------+

이 비율이 3보다 큰 경우해서 qcache_hits / Qcache_inserts 번호 :의 비율 "히트 및 기록되는"버퍼가 유효한 것을 나타내는 한, 그것을 초과하면 10 : 1, 매우 양호;

게시 된 210 개 원래 기사 · 원 찬양 14 ·은 50000 +를 볼

추천

출처blog.csdn.net/LU_ZHAO/article/details/105035546