2014-05-14 4 views
0

이 쿼리의 속도 향상에 도움이 필요합니다. p.article IN ('200101')에 기사가 하나만 있으면 쿼리가 0.0006 초 내에 실행됩니다. 두 개의 기사가 p.article IN ('200101','200102') 인 경우 쿼리는 0.6414 초 내에 실행됩니다.여러 IN에 대한 mysql 하위 쿼리 최적화

약 3000 개의 항목에 대해이 쿼리를 실행해야하므로 약간 속도를 높이고 싶습니다. 해결책은 INNER JOIN에 있지만 내 스스로 파악할 수는 없다고 생각합니다.

SELECT p.article, (
    SELECT s.final_item 
    FROM `structure` s 
    WHERE s.item = p.article 
    ORDER BY s.level DESC 
    LIMIT 1 
) AS final_item 
FROM products p 
WHERE p.article IN ('200101','200102') 
+0

당신이'structure.item'에 인덱스를해야합니까 : 당신은 항상 특정 제품에 대한 구조에 하나 이상의 행이있는 경우

, 당신이 시도를 줄 수 있을까? – Barmar

+0

@Barmar 예 제가 가지고 있습니다 – mend

+0

왜 3000 번 쿼리를 실행해야합니까? 주어진 질의가 질의 1이라면, query2는 어떻게 생겼을까요? – Lennart

답변

1

먼저 테이블 제품의 기사 및 테이블 구조의 항목에 대한 색인이 있어야합니다.

SELECT s.final_item, p.article 
    FROM `structure` s INNER JOIN products p ON s.item = p.article 
    WHERE s.article IN ('200101','200102') 
    ORDER BY s.level DESC 
    LIMIT 1 
+0

감사합니다. 한계 1은 이제 쓸모 없지만 코드의 나머지는 제가 문제를 해결하는 데 도움이되었습니다. – mend

+1

당신은 환영합니다,하지만 ... 이제 LIMIT 1은 왜 쓸모 없습니까? 주어진 제품에 대한 itmes 구조에서 가장 깊은 노드를 검색해야한다고 생각했습니다. 그렇지 않은 경우 코드를 작성하는 더 좋은 방법이 될 수 있습니다. 또한 제품의 모든 기사에 최소한 일치하는 행이 있는지 보장 할 수 있는지 확인하는 것이 중요합니다. – Fernando

+0

네 말이 맞아. LIMIT 1은 여전히 ​​필요합니다. 결과의 첫 번째 페이지에는 각각 1 개의 결과 만 있었으므로 잘못된 인상을 받았습니다. – mend