2017-09-28 12 views
0

조인과 하위 쿼리를 사용하여 쿼리를 작성합니다. 실행에는 2 분이 걸립니다. 나는 그것을 어떻게 최적화 할 수 없는가? 어떠한 제안?어떻게이 하위 쿼리를 최적화 할 수 있습니까?

select oli.*,oli2.* from order o 
LEFT JOIN order_line_item oli ON oli.order_id = o.id 
LEFT JOIN order_line_item oli2 ON oli2.id 
= (SELECT oli3.id FROM order_line_item oli3 
WHERE oli3.order_id = o.id 
AND oli.code = oli3.alternative 
GROUP BY oli3.code, o.id 
LIMIT 1) WHERE o.store_id != 100 GROUP BY oli.code, oli2.code, o.id 

내 하위 쿼리는 올바르게 작동하지만 시간이 오래 걸립니다. 실제로, 그것은 대체 제품을 찾습니다. 하위 쿼리를 최적화하려면 어떻게해야합니까?

+1

쿼리에 관련된 모든 테이블에 대해 'SHOW CREATE TABLE '출력을 제공하십시오. –

+1

또한'*'를 선택해야합니까? 모든 열이 필요하지 않은 경우 테이블 구조 (위에서 언급 한 내용)와 필요한 열에서 배운 내용을 기반으로 향상된 기능을 사용할 수 있습니다. –

+0

'*'때문에'GROUP BY'의 잘못된 사용과 같은 냄새가납니다. –

답변

0

oli2 ON의 하위 쿼리는 모든 행에 대해 실행해야하므로 속도가 느려집니다. 그것은이 단순화 될 수있다 :

SELECT 
    oli.*, 
    oli2.* 
FROM order o 

LEFT JOIN order_line_item oli 
ON oli.order_id = o.id 

LEFT JOIN order_line_item oli2 
ON (
    o.id = oli2.order_id 
    AND 
    oli.code = oli2.alternative 
) 

WHERE o.store_id != 100 

GROUP BY oli.code, oli2.code, o.id 
+0

감사합니다.하지만 여전히 느립니다. – willywonka15

0

code에 인덱스 때문에 "접두사"의 아마 쓸모가 없다. (확인을 위해 EXPLAIN SELECT ...을 제공하십시오.)

"767 limit in 5.6"에는 여러 가지 해결 방법이 있습니다. "191 수정"은 아마도 상황에 가장 나쁜 것입니다. 내 Limits blog에 수정 사항과 기타 4 가지가 나와 있습니다.

  • 3072 바이트 제한으로 5.7.7로 업그레이드하십시오 - 클라우드가이를 제공하지 않을 수 있습니다.
  • VARCHAR에서 255에서 191로 변경 - 191 자보다 긴 값은 손실됩니다 (거의 없습니까?);
  • ALTER .. CONVERT TO utf8 - 이모티콘과 일부 중국어가 손실됩니다.
  • (현재 수정 사항) "접두사"색인을 사용하십시오. 성능상의 이점 중 일부를 잃게됩니다.
  • 5.6/5.5/10.1로 유지하지만 4 단계를 수행하여 제한을 3072 바이트로 늘립니다 (블로그의 세부 정보).

codealternative을 모두 변경해야합니다. 이 권고로 충분하지 않다면, 나는 더 깊게 파고들 것이다.