2014-09-27 2 views
0

글쎄, 좋은 인덱스와 데이터가있는 큰 MySQL 테이블이 있는데이 데이터에 대한 통계 보고서를 만들어야합니다. 그것은 내가 이와 같은 쿼리에서 많은 것을 의미합니다.MySQL 테이블의 통계 빠른 컴퓨팅

select 
    count(*) n, 
    sum(if(column1>0,1,0)) n1, 
    sum(if(<simple expression>,1,0)) n2, 
    sum(if(<another simple expression>,1,0)) n3, 
    .... 
from table1 
left join table 2 ... 

group by <simple expression> 

이 쿼리는 매우 느립니다. 이 전체 테이블을 InnoDB에서 MyISAM으로 변환하면이 쿼리 시간을 30 초에서 8 초로 줄일 수 있지만 MyISAM에는 여러 사용자가 동시에이 테이블을 사용하는 것을 방지하는 다른 제한이 있습니다 (TABLE LOCK은 실제로 전체 응용 프로그램을 잠급니다). 전체 테이블을 메모리에로드해야하는 이유를 이해합니다. 테이블의 크기가 수 기가 바이트 인 것을 감안할 때, 거의 불가능합니다. 그래서 우리는 그러한 속도가 느려지는 것입니다. 이 문제에 대한 좋은 해결책을 찾고 있습니다. 아무도 나를 도울 수 있습니까?

+0

MySQL 부울에서는 정수 표현을 사용하므로이를 직접 요약 할 수 있습니다. –

+0

별도의 쿼리에서 각 선택 값을 시도해 볼 수 있습니까? 그것들 중 하나만 올바르게 최적화되지 않았거나 다른 것들을 느리게 할 수도 있습니다. MySQL은 각각의 값에 대해 다른 인덱스를 필요로 할 수 있으며 그 때문에 속도가 느려질 수 있습니다. 각자를 먼저 살펴보고 어떤 것이 빠르고 어떤 것이 천천히 보이는지 먼저 봅니다. – vrijdenker

+0

@ PM77-1은 다음과 같은 의미입니다 : SUM (IF (column1> 0,1,0)) 대신에'SUM (column1> 0)'을 사용할 수 있습니다. –

답변

0

해결책을 찾았습니다. 통계는 하루에 한 번 (또는 매시간) 1 회 전체로 계산 될 수 있으며 TRIGGER를 사용하여 특수한 "캐시"테이블에 저장된 현재 수정 된 통계를 수정할 수 있습니다. 그래서 우리는 그 테이블에 준비된 보고서를 갖게 될 것입니다. 통계 보고서를 받기까지 거의 0 시간!