2013-04-05 2 views
0

나는 많은 매개 변수 (최종 사용자가 채웠다)를 취하여 검색을 수행하는 기능을하는 저장 프로 시저를 작성하고 있습니다. 그러나 매개 변수에 값이없는 경우 WHERE 절에 포함하면 안됩니다. 이를 위해 나는 그렇게 같이는 OR 절의 첫 번째 일환으로 매개 변수에 대한 검사를 수행하고 있습니다 :MySQL 쿼리 쿼리에 의해 느려지는 테이블 조인

... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2) ... 

나는 다음과 같이 일반적인 선택 문에이를 통합 한 :

SELECT * 
FROM table1 t1 
WHERE (param1 = '' OR t1.field1 = param1) 

이 예제에는 명확성을 위해 하나의 매개 변수 만 포함되어 있습니다. 실제 쿼리에는 여러 매개 변수와 필드 비교가 포함됩니다.

제대로 작동하고 빠르게 실행됩니다 (예 : '실제'쿼리는 약 0.5 초 내에 결과를 반환합니다).

지금까지 그렇게 좋았습니다. 그러나 조인 된 테이블을 도입하면 상황이 잘못되기 시작합니다. 나는 아래의 쿼리를 실행하면 예를 들어, (실제 쿼리 3-4 초)으로 훨씬 더 오래 걸립니다 :

SELECT * 
FROM table1 t1 

LEFT JOIN table2 t2 
ON t1.table2Id = t2.id 

WHERE (param1 = '' OR t2.field1 = param1) 

조인 된 테이블의 매개 변수가 이제 필드에 비교되는 것을을 유의하시기 바랍니다 (표 2).

쿼리를 실행할 때 PARAM1이 값으로 채워지고이 예제의 모두, 내가 보장 한 그을 유의하시기 바랍니다.

위의 WHERE 절의 param1 = '' OR 섹션을 제거하면 이전의 가입되지 않은 쿼리만큼 빠르게 실행됩니다.

내 테이블에 사용 된 필드는 현재 색인이 생성 된 적이 없지만이 필드는 사용하고있는 문제와 아무런 차이가 없습니다.

누구나 왜 첫 번째 쿼리 (단일 테이블)가 빠르게 작동하지만 두 번째 쿼리 (조인 테이블)가 왜 오래 걸리는지 설명 할 수 있습니까?

미리 감사드립니다.

답변

0

드디어 표 2에 LEFT JOIN을 제거하고 아래에 따라 간단한 JOIN로 교체하여이 문제를 해결 :

SELECT * 
FROM table1 t1 

JOIN table2 t2 
ON t1.table2Id = t2.id 

WHERE (param1 = '' OR t2.field1 = param1) 

솔직히 말해서, 이것을 왼쪽 결합으로 만들 이유가 전혀 없었습니다. 나는 단지 생각하고 있지 않았다!어쨌든 에반과 마이클에게 많은 도움과 조언을 주신 데 대해 감사 드리며 (초고속 답변도).

0

JOIN의 일부로 첫 번째 조건을 추가하여 도움이되는지 확인해보십시오.

SELECT * 
FROM table1 t1 

LEFT JOIN table2 t2 
ON t1.table2Id = t2.id AND 
t2.field1 = param1 
+0

에반 감사합니다. 나는 당신이 제안한 것처럼 이것을 시도했지만 param1이 가치가있을 때 아무 결과도 얻지 못했습니다. –

+0

@JohnP 업데이트보기 - 마지막 행을 지우십시오. –

+0

죄송합니다. Evan. 불행히도 이제는 매개 변수없이 모든 매개 변수를 필터링 할 수 없습니다. –

0

보기를 작성하고 조인 문의 해당보기의 결과를 사용할 수 있습니다.

CREATE VIEW `VW_my_simple_table_view_name` AS SELECT * 
FROM table1 t1 
WHERE (param1 = '' OR t1.field1 = param1) 

다음 쿼리 (적응을해야 할 수도 있습니다) 다음과 같이 보일 것이다

SELECT * 
FROM VW_my_simple_table_view_name t1 

LEFT JOIN table2 t2 
ON t1.table2Id = t2.id 

WHERE (t2.field1 = param1) 
+0

안녕하세요. 의견을 보내 주셔서 감사합니다.하지만 그 방법이 효과가 있을지 잘 모르겠습니다. 내 가입 테이블을 살펴보면 예를 들어, table2의 필드에 매개 변수를 비교하고 있습니다. 실제로 table1의 필드 중 하나와 비교할 수 없습니다. 미안 커서를 어딘가에 놓으면! –