다음과 같이 쿼리 캐시를 비활성화해야합니다.
[mysqld]
query_cache_size = 0
그런 다음 mysql을 다시 시작하십시오. 내가 왜 그렇게 제안하겠습니까? ???
쿼리 캐시는 항상 InnoDB와 충돌합니다. 수정이 다른 트랜잭션에 대한 반복 가능한 읽기에 영향을 미치지 않으면 InnoDB의 MVCC가 쿼리 캐시에서 쿼리를 제공 할 수 있다면 좋을 것입니다. 불행히도 InnoDB는 그렇게하지 않습니다. 분명히, 당신은 오히려 빨리 무효화되고 아마도 재사용되지 않는 많은 쿼리를 가지고 있습니다.
MySQL 4.0 미만의 InnoDB의 경우 트랜잭션에 대해 쿼리 캐시가 비활성화되었습니다. MySQL 4.1+의 경우, InnoDB는 테이블별로 쿼리 캐시에 대한 액세스를 허용 할 때 트래픽 경찰을 재생합니다.
귀하의 질문의 관점에서, 쿼리 캐시 제거의 정당화는 오버 헤드가 아니라 InnoDB가 그것을 관리하는 방법이라고 말합니다.
InnoDB가 쿼리 캐시와 상호 작용하는 방법에 대한 자세한 내용은 "고성능 MySQL (제 2 판)" 책 213-215 페이지를 참조하십시오 .
모든 데이터 또는 대부분의 데이터가 MyISAM 인 경우 SQL_NO_CACHE를 사용하는 원래 아이디어를 사용할 수 있습니다.
InnoDB와 MyISAM이 혼합 된 경우 캐시 미스가 얼마나 높은지에 따라 애플리케이션에 적합한 균형을 찾아야합니다. 실제로, 동일한 책의 209-210 페이지 는 캐시 누락에 대한 이유를 지적합니다.
- 비 결정적 구조 (예 : CURRENT_DATE)를 포함하거나 결과 세트가 저장하기에 너무 커서 쿼리를 캐시 할 수 없습니다. 캐시 할 수없는 쿼리 유형 모두 Qcache_not_cached 상태 변수를 증가시킵니다.
- 서버는 이전에 쿼리를 본 적이 없으므로 결과를 캐시 할 기회가 없었습니다.
- 쿼리 결과는 이전에 캐시되었지만 서버에서 제거했습니다. 메모리를 확보하기에 메모리가 부족하거나 누군가 서버에 메모리를 제거하도록 지시했거나 무효화 되었기 때문에 이러한 상황이 발생할 수 있습니다.
캐시 할 수없는 쿼리가 거의없는 캐시 미스의 근본 원인은 다음과 같습니다.
- 쿼리 캐시가 아직 준비되지 않았습니다. 서버가 캐시에 결과 세트를 채울 기회가 없었습니다.
- 서버는 이전에는 보지 못한 쿼리를보고 있습니다. 반복되는 쿼리가 많지 않으면 캐시가 예열 된 후에도 발생할 수 있습니다.
- 캐시 무효화가 많이 있습니다.
업데이트 2012-09-06 10:10 EDT
최신 업데이트 정보 query_cache_limit
를보고 1048576 (1M)로 설정했습니다. 결과 집합을 1M로 제한합니다. 더 큰 것을 검색하면 캐시되지 않습니다. 당신이 한 있지만 query_cache_size
104857600 (100M)로 설정, 이것은 단지 완벽한 세계를 배경으로 100 개 캐시 된 결과 수 있습니다. 수백 개의 쿼리를 수행하면 조각화가 다소 빨리 발생합니다. 최소 크기 결과 집합으로 4096 (4K)도 있습니다. 불행히도 mysql에는 쿼리 캐시 조각 모음을위한 내부 메커니즘이 없습니다.
쿼리 캐시가 있어야하고 RAM이 너무 많은 경우 다음을 실행할 수 있습니다.
SET GLOBAL query_cache_size = 0;
SELECT SLEEP(60);
SET GLOBAL query_cache_size = 1024 * 1024 * 1024;
쿼리 캐시를 제거합니다. 캐시 된 모든 결과가 손실되므로 사용량이 적은 시간에이 줄을 실행하십시오.
또한 다음을 할당합니다.
- query_cache_size = 1G
- query_cache_limit = 8M
RAM은 23G입니다. 나는 다음을 제기 할 것이다 :
- innodb_buffer_pool_size = 12G
- key_buffer_size = 4G
그것은 7G를 떠난다. OS 및 DB 연결에 적합해야합니다.
키 버퍼는 MyISAM 인덱스 페이지 만 캐시하고 InnoDB 버퍼 풀은 데이터와 인덱스를 캐시합니다.
한 가지 더 권장 사항 : MySQL 5.5로 업그레이드하여 여러 CPU에 대해 InnoDB를 구성하고 읽기 / 쓰기 I / O에 대해 여러 스레드를 구성 할 수 있습니다.
InnoDB 용 다중 CPU 액세스와 함께 MySQL 5.5 사용에 대한 이전 게시물을 참조하십시오.
업데이트 2012-09-06 14:56 EDT
쿼리 캐시를 지우는 방법은 캐시 된 데이터를 호스 핑하고 완전히 다른 RAM 세그먼트를 형성하기 때문에 다소 극단적입니다. 당신이 당신의 의견에서 지적했듯이 FLUSH QUERY CACHE
(당신이 제안한대로) 또는 심지어 RESET QUERY CACHE
더 좋을 것입니다. 명확히하기 위해, "내부 메커니즘 없음"이라고 말했을 때, 나는 정확히 그 의미를 가졌습니다. 조각 모음이 필요하며 수동으로 수행해야합니다. crontab'd이어야 합니다.
MyISAM보다 InnoDB에서 DML (INSERT, UPDATE, DELETE)을 더 자주 수행한다면 쿼리 캐시를 완전히 제거한다고 말하고 싶습니다.