2009-11-17 6 views
3

사용자가 주어진 필터 집합 (예 : 날짜 범위)에 대한 통계를 요청할 수 있어야하는 상당히 큰 통계 시스템을 구축 중입니다.MySQL의 쿼리 캐싱

SELECT player_id, SUM(kills) as kills 
FROM `player_cache` 
GROUP BY player_id 
ORDER BY kills DESC 
LIMIT 10 
OFFSET 30 

상기 질의 (30) (결과, 즉 3 '페이지')에 의한 결과를 상쇄이 각 플레이어했다 명의 player_id 및 양을 포함하여 10 개 개의 결과를 반환하는 단순 쿼리이다. 그런 다음 사용자가 '다음'페이지를 선택하면 30 대신 OFFSET 40이 사용됩니다.

LIMIT/OFFSET 쌍이 동일한 데이터 집합에서 사용되고 있음에도 불구하고 캐시되지 않습니다. SUM()을 다시 수행하여 결과를 10만큼 더 상쇄합니다.

위의 예는 더 많은 필드를 반환하는 매우 큰 쿼리의 단순화 된 버전이며 매우 오랜 시간 (20 초 이상 소요되며 시스템이 커질수록 길어집니다)입니다.

그래서 LIMIT/OFFSET이 적용되기 전에 상태를 캐싱하여 페이지로드 속도를 높이는 솔루션을 찾고 있습니다.

답변

3

물론 캐싱을 사용할 수는 있지만 결과를 캐싱하는 것이 좋습니다. mysql의 쿼리가 아닙니다.

그러나 첫 번째 것들 먼저, 가) 당신이 되 고 데이터에 적절한 색인, B)를 사용 있는지 확인하십시오.

큰 테이블 세트를 사용하는 경우 그룹 기준이 느려지므로 정적 테이블/파일/데이터베이스에 요약 데이터를 넣어야합니다.

데이터의 서버 측 캐싱을 수행하는 데 도움이되는 여러 기술/라이브러리 등이 있습니다. PHP Caching to Speed up Dynamically Generated Sites은 이것에 대한 아주 단순하지만 자명 한 예를 제공합니다.

1

주기적으로 긴 쿼리를 실행하고 모든 결과를 요약 테이블에 저장하는 것을 고려한 적이 있습니까? JOIN이없고 GROUP이 없으므로 요약 테이블을 신속하게 조회 할 수 있습니다. 단점은 요약 테이블이 최신 전류가 아니라는 것입니다.

이 문제는 LIMIT/OFFSET 문제를 해결하지 못한다는 것을 알고 있지만 어려운 쿼리를 여러 번 실행하는 문제를 해결합니다.

+0

쿼리 필터로 인해 불행히도이 작업을 수행 할 수 없습니다. 다른 필터는 반드시 긴 쿼리를 다시 수행해야합니다.이 쿼리는 함께 사용해야하지만 LIMIT/OFFSET 문제를 해결하려고합니다. 이 방법을 사용할 수있는 유일한 방법은 각 필터 유형에 대해 여러 개의 요약 테이블을 갖는 것입니다. 날짜 범위가 무한 할 경우 무한합니다. –

+0

필터 요구 사항과 일치하도록 요약 테이블을 올바르게 디자인하는 방법이 있어야합니다 . (아마도 모든 관련 필터에 대한 요약 테이블에 필드를 추가하여). –

+0

어떻게? 기간 필터를 사용하면 가능한 쿼리의 양이 무한합니다! –

0

데이터 업데이트 빈도에 따라 데이터웨어 하우징이 이에 대한 간단한 해결책입니다. 기본적으로 당신은 :

  1. 당신이 그것을
  2. 주기적으로 (예를 들어 하룻밤 각을 원하는
  3. 는 모양에 데이터를 가져 오기위한 데이터웨어 하우스 데이터베이스를 최적화 유사한 테이블 구조와 두 번째 데이터베이스 (데이터웨어 하우스) 구축 하루) 라이브 데이터베이스에서 데이터웨어 하우스로 데이터 복사
  4. 페이지를 데이터웨어 하우스에서 가져옵니다.

이 사용할 수있는 다른 최적화 기법이 있지만, 그것은으로 보는 가치 : 기존 테이블에 추가 인덱스를 추가

  • 에보고 할 필요가없는 필드를 제거

    1. 필요한 모양의 데이터를 요약하는 새 테이블/뷰 추가.