2011-11-07 4 views
0

아래 쿼리에서 확장 설명을 실행 중이며 왜 이런 일이 발생하는지 잘 모르겠습니다. site.id, site.parent_id, and site.enabled에 색인을 추가했지만 여전히 임시 테이블을 만드는 중입니다.쿼리에서 임시 테이블 사용 방지

SELECT site.label AS site_label, deal . * , site.id AS site_id 
FROM site 
LEFT JOIN deal ON (deal.site_id = site.id 
AND DAYOFYEAR(deal.created) = DAYOFYEAR(NOW())) 
WHERE (
site.id =2 
OR site.parent_id =2 
) 
AND site.enabled =1 
ORDER BY site.order ASC , deal.created DESC 

임시 테이블을 사용하지 못하게하는 방법에 대한 제안 사항이 있으십니까?

id select_type table type possible_keys key key_len ref rows filtered Extra 
1 SIMPLE site ALL id,parent_id,id_2 NULL NULL NULL 10 100.00 Using where; Using temporary; Using filesort 
1 SIMPLE deal ref site_id site_id 4 dealclippings.site.id 235 100.00 
+0

"임시 테이블"레이블을 사용하지 않고 쿼리가 더 빨리 실행되도록하려면 어떻게해야합니까? '여전히 임시 테이블을 만드는 중이 야. '그래서 뭐? – zerkms

답변

2

당신은 잘 최적화 할 수없는 쿼리 수행 : 사용 (다른 방향으로 정렬 OR의 사용을 피하는

  1. 시도
  2. MySQL은 (사용 인덱스)를 최적화 할 수 있습니다 모두 ASCDESC 하나 있음 ORDER BY)
  3. DAYOFYEAR(deal.created) 검색란 위에 기능을 사용하지 마십시오

그러나 쿼리 결과에 만족할 때까지 해당 temporary table 레이블을 인식하면 안됩니까? 그렇지 않습니까?

+0

고맙습니다. .... 고맙습니다. 만족합니다.하지만 내 사이트에 대한 기본 질문이기 때문에 어쨌든 개선 할 수 있는지 확인해야한다고 생각했습니다. – Webnet

+0

@Webnet : 10x235 행이 너무 작아 걱정할 필요가 없습니다. 하지만 어쨌든 1, 2, 3 항목을 기억해 두십시오. 위에서 언급 한 것입니다. – zerkms

+0

나는 좋은 지적이다. – Webnet