2013-02-25 4 views
-1

누구든지이 쿼리를 최적화 할 수 있습니까?하위 쿼리가없는 MySql 쿼리 최적화

SELECT distinct t.designation, 
     (SELECT sum(time_to_sec(timediff(outtime,intime))) 
     FROM onlinetime where datecreated BETWEEN '2012-01-01 00:00:01' 
     AND '2012-12-31 23:59:59' and designation=t.designation) as totsec 
FROM onlinetime t; 

onlinetime 테이블에서 지정 및 총 시간 (초)을 가져 오려고합니다. 그것에는 8000 개의 레코드 만 있지만 위 쿼리는 많은 시간이 걸립니다. 이것을 최적화하는 다른 방법이 있습니까?

답변

3

왜 당신이 직접 단지 빠른 성능을 위해 열 datecreated에 인덱스를 추가하는 각 지정

SELECT designation, sum(time_to_sec(timediff(outtime,intime))) totsec 
FROM onlinetime 
WHERE datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59' 
GROUP BY designation 

에 대한 총 요약을 얻을 수있을 때 당신이 테이블에 가입해야합니까.

ALTER TABLE onlinetime ADD INDEX (datecreated) 

또는 어쩌면 당신이 원하는,

SELECT a.designation, 
     COALESCE(sum(time_to_sec(timediff(b.outtime,b.intime))), 0) totsec 
FROM onlinetime a 
     LEFT JOIN onlinetime b 
      ON a.designation = b.designation AND 
       b.datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59' 
GROUP BY a.designation 
+0

이것이 내가 원하는 것입니다 ... 시간 내 주셔서 감사합니다 ... – user1854007

+0

안녕하세요. : D –

0

정답은 다음 where 절에 필터링을 퍼팅

SELECT t.designation, 
     sum(case when datecreated between '2012-01-01 00:00:01' AND '2012-12-31 23:59:59' 
       then sum(time_to_sec(timediff(outtime,intime) 
      end) as totsec 
from onlinetime t 
group by t.designation 

가있는 원래 쿼리의 의도를 그리워 모든 "지정"을 테이블에 보관하십시오.