2010-06-09 3 views
1

매일 15,000 개가 넘는 행이 가장 많이 업데이트되는 테이블이 있습니다. 나는 캐시 된 캐시가 있기 때문에 페이지가 더 빨리로드되지만 매번 데이터베이스가 업데이트되어 페이지로드가 느려지 며 다시 캐쉬가 생성된다고 가정합니다.수동으로 mysql 캐시를 작성하는 방법

그래서 지금은 서버에서 wget -m --delete-after http://localhost/을 수행하는 데 의존했지만이 작업을 완료하는 데 약 4 시간이 소요되며 13 기가와 같이 움직입니다.

더 좋은 방법이 있나요?

답변

4

MySQL 캐시는 MyISAM 스토리지 엔진을 사용하는지 InnoDB 스토리지 엔진을 사용하는지에 따라 다르게 작동합니다.

MyISAM은 인덱스가 아닌 데이터 만 캐시합니다. LOAD INDEX INTO CACHE을 사용하여 MyISAM 색인을 키 버퍼 캐시에 미리로드 할 수 있습니다. 그러나 InnoDB를 사용한다면 동등한 진술은 없다.

InnoDB는 데이터 페이지와 색인 페이지를 모두 캐시합니다. 캐시 버퍼를 예열하는 특별한 명령은 없지만 전체 테이블 스캔과 전체 인덱스 스캔을 수행하여 버퍼에로드하는 몇 가지 SQL 문을 실행할 수 있습니다. wget에 의지하지 않고 서버의 스크립트를 사용하여이 작업을 수행 할 수 있어야합니다!

@code_burgar의 대답에 동의합니다. 150KB 행은 캐시가 예열되는 동안 많은 성능 저하를 느끼지 않도록 충분히 작습니다.

Query Cache의 워밍업에 대해 이야기하는 경우 다른 문제입니다. 특정 SQL 쿼리를 사용하여 쿼리 캐시를 워밍업해야합니다. 캐시는 해당 SQL 쿼리와 연결된 결과 집합을 축 어적으로 유지하기 때문입니다. 귀하의 wget 솔루션은 비효율적이며 많은 작업을 중복시킬 수 있습니다. 번 캐시하려는 각 쿼리를 실행하는 서버에서 스크립트를 실행하여 쿼리 캐시를 준비 할 수 있어야합니다.

그러나 이러한 쿼리가 무엇인지 파악하고 코드가 변경된 경우 주기적으로 캐시 미리로드 스크립트를 업데이트하려면 코드 검토가 필요할 수 있습니다.

+0

고맙습니다. MyISAM입니다. 그래서 아침에 LOAD INDEX INTO CACHE 명령을 시도해보고 트릭을 수행하는지 확인해 보겠습니다. 쿼리 캐시의 경우 각 테이블에서 모두 선택하는 것처럼 간단할까요? – hamstar

+1

쿼리 캐시는 특정 쿼리에 대한 결과 집합을 캐시합니다. 따라서 각 테이블에서 모든 항목을 선택하는 것은 도움이되지 않습니다 (앱에서 사용하는 쿼리가 아닌 한 의심 스럽습니다). –

+0

그것은 그것 (지금 그것으로서의 빠른)을했다 :) 감사합니다! – hamstar

1

150,000 개의 행이 테이블 크기면에서 실제로 작습니다.

테이블이 제대로 인덱싱됩니까?

업데이트를 어떻게 하시겠습니까? 일정을 계획하고 있습니까? 아니면 업데이트를 조절하고 있습니까?

서버가 숨을 쉴 때 한 번에 너무 많은 행을 업데이트하려고하기 때문에 속도가 느려질 가능성이 큽니다. 업데이트를 조절하십시오.

+0

제대로 색인이 생성되어 있다고 나는 믿습니다. 데이터베이스를 만들지는 않았지만 생각했던 사람들은 꽤 생각했습니다. 업데이트는 한 번에 끝이 아닌 데이터베이스로 완료되며 1.5 시간이 걸립니다 (스파이더 링). 그런 다음 테이블은 라이브 DB를 통해 복사되며 약 3 초가 걸립니다. 그 후 사이트의 페이지가 천천히로드됩니다. – hamstar

관련 문제