2013-08-10 3 views
0

표에는 온도, 위치 및 날짜 및 기타 현재 사용되지 않는 데이터가 있습니다. 메시지는 온도 센서 밖에, 주방, 거실 예이다 locationmap 곳이다)위치별로 최신 온도 표시

쿼리! 현재 온도를 표시하도록 PHP 코드를 생성

SELECT 
    t1.* 
FROM  
    temperatures t1 
JOIN (
    SELECT 
     locationmap 
     , MAX(timeof) AS timeof 
    FROM 
     temperatures 
    GROUP BY 
     locationmap 
    ) AS t2 
ON t1.locationmap = t2.locationmap AND t1.timeof = t2.timeof 
WHERE 
    DATE(t1.timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) AND CURDATE()"; 

;

// Print out result 
while($row = mysql_fetch_array($result)){ 
    echo $row['locationmap']. " - ". $row['message']. " @". $row['timeof']; 
    echo "<br />"; 
} 

그냥 그것이 현재 않는 각 위치에 대한 최신 온도를 표시 할하지만 결과를 표시 7secs 걸리는 순간으로 나는, 속도를 위해이 경우 가장 최적화 된 쿼리를 궁금 해서요!? M : 느린 서버가 있지만 유일한 사용자입니다.

Thx.

참고하시기 바랍니다. 테이블, 인덱스 및 스토리지 엔진

에 대한 자세한 정보를 문을 작성하고 PHP 코드에서 SQL 코드를 읽기 바랍니다없이 results

답변

1

Data types indexes 그것은 하드 빌어 먹을입니다 말할 수 없습니다 이렇게 읽으십시오. 내가 도와 tryed 때문에

SELECT 
    t1.* 
FROM  
    temperatures t1 
JOIN (
    SELECT 
     locationmap 
     , MAX(timeof) AS timeof 
    FROM 
     temperatures 
    GROUP BY 
     locationmap 
    ) AS t2 
ON t1.locationmap = t2.locationmap AND t1.timeof = t2.timeof 
WHERE 
    DATE(t1.timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) AND CURDATE() 

같은 쿼리하지만 더 읽을 수

마이너스 1

덕분 ...

이 쿼리를 실행해야 볼만한 빠른

SELECT 
    t1.locationmap 
    , t1.message 
    , t1.timeof 
FROM  
    temperatures AS t1 
JOIN (
    SELECT 
     locationmap 
     , MAX(timeof) AS timeof 
    FROM 
     temperatures 
    GROUP BY 
     locationmap 
    ) AS t2 
ON t1.locationmap = t2.locationmap AND t1.timeof = t2.timeof 
WHERE 
    DATE(t1.timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) AND CURDATE() 

그리고 locationmap, timeof 및 message (선택 사항)에 대한 표지 BTREE (MyISAM을 사용하거나 innodb 색인이 이미 BTREE 인 경우) 인덱스가 있는지 확인하십시오 (이처럼 색인을 작성하십시오) 삽입 색인으로 인해 삽입, 업데이트 및 삭제가 눈에 띄게 느리게 실행됩니다. 그래서 속도를 높이려면 멀티 인서트를 시도하십시오.

+0

제안 사항에 대해 Thx가 질문을 쉽게 읽을 수 있도록 제 질문을 수정했습니다. 새 쿼리가 이전 쿼리보다 느린 것으로 나타났습니다. 내 것은 7 초 였지만 네가 14 초에 달렸다. 테이블은 Innodb로 설정됩니다. 인덱스는 mysql에 대한 ID, 미안 초보자 용으로 만 설정되며 locationmap, timeof 및 message에 대한 다른 인덱스를 추가합니까? 나는 그동안 약간의 연구를 할 것입니다. (일부 스크린 샷을 테이블 및 인덱스 내 질문에 추가했습니다) –

+0

locationmap, timeof, 인덱스에 대한 인덱스 도움이 될 것이라고 생각하지만 또한 테이블 구조를 변경해야합니다. 데이터 요구 사항에 대해 열 유형이 최적이 아닙니다. –

관련 문제