2008-11-13 14 views
0

이 하위 쿼리에 대해 인덱스를 사용하는 MySQL이 아닌 이유는 무엇입니까?

SELECT layerID 
FROM layers 
WHERE ownerID = ? 
AND collectionID = ? 

어느 layerID의 배열을 줄 것입니다 다음 루프 및 각 이렇게 :

SELECT DATA 
FROM drawings 
WHERE layerID = ? 

그리고 그것은 모두 잘 작동합니다. 그래서 지금은 한 단계에서 그것을하려고, 그래서 이것을 시도 :

SELECT DATA , layerID 
FROM drawings 
WHERE layerID = ANY (
    SELECT layerID 
    FROM layers 
    WHERE ownerID = ? 
    AND collectionID = ? 
) 

하지만 어떤 이유로, 그것은 SELECT DATA etc, 메인 쿼리에 대한 색인을 사용하지 않습니다! 따라서이 하나의 결합 된 쿼리는 이전에 수행했던 별도의 쿼리와 비교하여 완료하는 데 훨씬 더 오래 걸립니다. (byway, 서브 쿼리, SELECT layerID etc는 여전히 인덱스를 사용합니다).

'EXPLAIN'문을 사용하여 쿼리를 사용하는지 여부를 결정했습니다.

layers 테이블의 ownerIDcollectionID 열과 drawings 테이블의 layerID 열에 개별 인덱스가 있습니다.

쿼리에 어떤 문제가 있습니까?

답변

5

참여를 시도하십시오. ANY는 쿼리 최적화 프로그램에 대해 최적화 할 수없는 UNION과 비슷하게 보입니다.

SELECT d.DATA, d.layerID 
FROM drawings AS d 
INNER JOIN layers AS l ON d.layerID = l.layerID 
WHERE l.ownerID = ? AND l.collectionID = ? 
+0

감사합니다. 하위 쿼리를 사용하지 않고 대신 조인을 사용하여 연습하십시오. 처음에는 하위 쿼리가 더 쉽게 이해할 수 있습니다. – davr

0

나는 전에 어떤 키워드를 볼 수없는,하지만 당신은

 
SELECT DATA , layerID 
FROM drawings 
WHERE layerID IN (
    SELECT layerID 
    FROM layers 
    WHERE ownerID = ? 
    AND collectionID = ? 
) 

의지를하려고하면 같은 문제가 그 적이있다? 나는 그렇게해서는 안된다. 그러나 INNER JOIN은 아마도 조금 나아질 것입니다.

+0

"= ANY"와 "IN"은 대부분 똑같은 일을한다고 저는 믿습니다. – davr