2011-04-13 10 views
1
의 평균을 얻으려고 노력

나는 다음과 같은 쿼리를 가지고 :MySQL의 최적화 쿼리 : 하위 쿼리

SELECT AVG(time) FROM 
(SELECT UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time 
    FROM table 
    WHERE id IN 
     (SELECT DISTINCT id 
      FROM table 
      WHERE product_id = 12394 AND datelast > '2011-04-13 00:26:59' 
     ) 
GROUP BY id 
) 
as T 

쿼리가 가장 큰 datelast의 값을 가져옵니다과의 길이 모든 ID에 대한 가장 큰 datestart 값 (에서 차감 사용자 세션)를 선택하고 평균을 계산합니다.

외부 쿼리는 결과 시간의 평균을 나타냅니다. 이 쿼리를 최적화 할 수있는 방법이 있습니까? EXPLAIN에서

출력 :

id select_type   table  type   possible_keys   key  key_len ref  rows extra 
1 PRIMARY    <derived2> ALL    NULL     NULL NULL NULL 7 
2 DERIVED    table  index   NULL     id  16  NULL 26  Using where 
3 DEPENDENT SUBQUERY table  index_subquery id,product_id,datelast id  12  func 2  Using index; Using where 
+0

질문의 정보, EXPLAIN SELECT의 출력 내용 등의 정보가 누락되었습니다. –

+0

원본 게시물이 업데이트되었습니다. – Tony

답변

0

첫 번째 SELECT 정말 필요합니까?

SELECT 
    AVG(time) 
FROM 
(
    SELECT 
    UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time 
    FROM 
    table 
    WHERE 
    product_id = 12394 AND datelast > '2011-04-13 00:26:59' 
    GROUP BY 
    id 
) 

지금 테스트 할 수 없으며 제대로 작동 할 것입니다. 그렇지 않으면 쿼리가 잘 보입니다.

(datelast, product_id) 키를 추가하여 쿼리를 최적화 할 수 있습니다 (선택도를 높이려면 항상 가장 제한적인 필드를 먼저 입력하십시오).

+0

당신의 버전에서 max (datelast)가 datelast> '2011-04-13 00:26:59'절에 의해 제한되어 있기 때문에 테스트 해 보았습니다. 그 문제를 해결할 방법이 있습니까? 난 단지 하나의 datastore 값을 모든 행이 아닌 절에 맞추기 만하면됩니다. – Tony

+0

이전 쿼리를 사용할 때 max (datelast) < '2011-04-13 00:26:59'라는 뜻입니까? 당신이 datelast> '2011-04-13 00:26:59'인 곳을 선택했기 때문에 이것은 이상합니다. max (datelast)는 항상 '2011-04-13 00:26:59'일 수 있습니다. 어쨌든 제가 말씀 드린 것처럼 첫 번째 쿼리가 정확하고 새로운 인덱스로 성능을 향상시킬 수 있다고 생각합니다. –