2011-03-08 6 views
1

mysql에서 쿼리에 문제가 있습니다. 차트 음모를 꾸미고, 나는이 간단한 구조로 'X SECOND'간격으로 임시 테이블을 만드는거야 :mysql에서 천천히 선택

CREATE TEMPORARY TABLE intervals (date DATETIME NOT NULL PRIMARY KEY) 

및 쿼리이 SELECT :

SELECT COUNT(dt.Device) AS count, i.date 
FROM intervals i LEFT JOIN device_tracker dt ON 
    i.date <= dt.date AND 
    i.date + INTERVAL X SECOND >= dt.date 
GROUP BY i.date 

Device는 기본 키 및 dt.date입니다 색인입니다.

device_tracker의 20000 개의 행과 30-35 간격의 쿼리에는 약 4-5 초가 걸립니다. 그게 정상인가요? 속도 향상을 위해 뭔가를 할 수 있습니까?

이것은 설명입니다 :

id select_type table type possible_keys key  key_len ref rows Extra 
------------------------------------------------------------------------------------------------------------------- 
1 SIMPLE  i  index NULL   PRIMARY 8  NULL 29  Using index; Using temporary; Using filesort 
1 SIMPLE  dt  ALL  date   NULL  NULL  NULL 21594 

편집는 : LAST_TIME 내가 대신 날짜를 사용하고, 존재하지 않습니다.

+0

dt.Last_Time에 대한 색인이 있습니까? –

+0

내 잘못 이었어. 전 현장 이름을 바꿨어요. 색인으로 문제가 계속됩니다. –

+0

간격 계산을 ON 조건의 오른쪽으로 이동하면 설명이 변경됩니까? i.date> = dt.date에서 - INTERVAL X SECOND? – Galz

답변

1

:

WHERE 대신 HAVING를 사용해보십시오 : SELECT ... LEFT JOIN ... GROUP BY ... HAVING i.date IS NOT NULL

그것은했다.

0

문제는 아마도 device_tracker의 Last_Time 필드 일 수 있습니다. 당신은 같이 날짜와 LAST_TIME ... 모두에 인덱스를 시도 할 수 있습니다 : Galz 응답에서

CREATE INDEX myGreatIdx ON device_tracker(date, Last_Time); 
+0

내 잘못 이었어, 전 현장 이름을 바꿨어. 색인으로 문제가 계속됩니다. –