2011-03-13 15 views
0

나는이 두 테이블을 가지고있다. 명령을 설명하기 위해, 나는MySQL의 쿼리 최적화 지원

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra 
--------------------------------------------------------------------------- 
1,PRIMARY,<derived2>,ALL,NULL,NULL,NULL,NULL,4557,"Using filesort" 
1,PRIMARY,c,ref,idx_usagetime,idx_usagetime,9,j.usagetime,1,"Using where" 
2,DERIVED,j,ALL,NULL,NULL,NULL,NULL,4557,"Using temporary; Using filesort" 
2,DERIVED,c,index,idx_usagetime,idx_usagetime,9,NULL,2880,"Using index" 

당신이 저에게이 SQL 쿼리를 최적화 할 수있는 몇 가지 팁을 줄 수이 출력을 가지고

? 당신은 덜 비교 이상에 합류

Mysql join with time matching

답변

0

시도 :

id select_type   table type possible_keys key key_len ref rows Extra 
------------------------------------------------------------------------------------------------ 
'1', 'PRIMARY',   'ji', 'ALL', NULL,   NULL, NULL, NULL, '12', '' 
'2', 'DEPENDENT SUBQUERY', 'ci', 'ALL', 'idx_usagetime', NULL, NULL, NULL, '6', 'Using where; Using filesort' 
: 여기

SELECT ji.starttime, 
     ji.endtime, 
     ji.jobname, 
     (SELECT ci.cpuusage 
      FROM CPUINFO ci 
     WHERE ci.usagetime <= ji.endtime 
     ORDER BY ci.usagetime DESC 
     LIMIT 1) AS cpuusage 
    FROM JOBINFO ji 

은 내 5.1.49에 출력을 EXPLAIN의

0

: 여기

내 orginal 한 게시물입니다 시작 시간 작업보다 usagetime 적은이있는 모든 CPU 기록을 의미

c.usagetime <= j.starttime 

직업 기록에 합류합니다. 이 쿼리는 몇 달 전의 정보를 결합하기 때문에 시간이 지남에 따라 느려지고 느려질 것입니다. 작업 시작 시간 전에 최신 항목에만 관심이 있습니다.

작업 시작 시간의 일정 기간 내에 cpuinfo 레코드가 있다고 확신되면 범위 검색으로 변경하십시오.

c.usagetime between j.starttime and date_sub(j.starttime, interval 5 minute) 

상당히 빨라야합니다. 더 작 으면 간격을 더 좋게 만들 수 있습니다.

0

당신은이 작은 트릭을 시도 할 수 :

SELECT j.id, j.starttime, j.endtime, j.jobname, c.cpuusage 
FROM 
(
    SELECT j.id, j.starttime, j.endtime, j.jobname, MAX(c.usagetime) AS usagetime 
    FROM jobinfo AS j 
    LEFT JOIN cpuinfo AS c 
    ON c.usagetime <= j.starttime 
    WHERE c.usagetime > DATE_ADD(j.starttime, INTERVAL -1 DAY); 
    GROUP BY j.id 
) AS j 
JOIN cpuinfo AS c 
ON j.usagetime = c.usagetime 
ORDER BY j.starttime; 

이 서버가 단지 오 cpuinfo의 테이블의 일부 나 전체 또는 절반을하게한다.

추신 : 간격 값을 고려해보십시오. 아마도 5 분이 적당 할 것입니다.