나는 많은 매개 변수 (최종 사용자가 채웠다)를 취하여 검색을 수행하는 기능을하는 저장 프로 시저를 작성하고 있습니다. 그러나 매개 변수에 값이없는 경우 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
섹션을 제거하면 이전의 가입되지 않은 쿼리만큼 빠르게 실행됩니다.
내 테이블에 사용 된 필드는 현재 색인이 생성 된 적이 없지만이 필드는 사용하고있는 문제와 아무런 차이가 없습니다.
누구나 왜 첫 번째 쿼리 (단일 테이블)가 빠르게 작동하지만 두 번째 쿼리 (조인 테이블)가 왜 오래 걸리는지 설명 할 수 있습니까?
미리 감사드립니다.
에반 감사합니다. 나는 당신이 제안한 것처럼 이것을 시도했지만 param1이 가치가있을 때 아무 결과도 얻지 못했습니다. –
@JohnP 업데이트보기 - 마지막 행을 지우십시오. –
죄송합니다. Evan. 불행히도 이제는 매개 변수없이 모든 매개 변수를 필터링 할 수 없습니다. –