2012-07-10 2 views
2

아래 last_name이 NULL이면 성능을 높이기 위해 해당 열의 WHERE 비교를 건너 뛸 것인가?MySQL 및 WHERE 절을 건너 뜁니다

AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%')) 
+1

이라고 "단락"평가. 검색하면 더 많은 결과를 얻을 수 있습니다. –

+0

나는 아래의 나의 대답에 관심의 대상이 될 수있는 몇 가지 검사를 실시했다. –

+0

나는 매우 흥미로운 것을 보았다. –

답변

2

MySQL은 어느 순서로든 비교를 수행 할 수 있습니다.

가장 빨리 계산하기 때문에 NULL 검사를 먼저 수행 할 가능성이 높지만 이는 보장 할 수 없습니다.

+0

우연히 NULL을 선택하면 두 번째 비교를 건너 뜁니 까? –

+0

호기심에서 피하고있는 것처럼 보이는 더 간단한'WHERE sp.last_name LIKE CONCAT ('%', last_name, '%'))을 시도해 보셨습니까? 그것은 당신이 두려워하는만큼 느리지는 않다는 것을 알 수 있습니다 ... –

+0

나는 쿼리 시간이 약간 증가했습니다. –

2

필자가 아는 한, 사실입니다. 후자의 표현을 평가하지 않고 행을 포함하게됩니다. 그러나 후자의 표현식이 부울 효과 (예 : 카운터 증가)를 생성하고 last_name 열에 NULL 만있는 데이터 세트에 대해 실행되기 전과 후에 카운터를 검사함으로써 알려진 데이터 세트로 테스트 할 수 있습니까?

편집 : 테스트 v5.5.25 호기심에 대한

:

+------+ 
| name | 
+------+ 
| NULL | 
+------+ 
| Bill | 
+------+ 

각 쿼리가 아래 set @foo=0; 앞에는 다음 select @foo;의 결과가 표시됩니다.

SELECT name FROM names WHERE (@foo:[email protected]+1 OR name IS NULL); 
-- 1 (did optimize) - same without parenthesis 

SELECT name FROM names WHERE name IS NULL OR (@foo:[email protected]+1); 
-- 1 (did optimize) 

SELECT name FROM names WHERE (@foo:[email protected]+1) OR name IS NULL; 
-- 2 (did not optimize) 

흥미롭게도이 방법으로 최적화되지 않은 업데이트 쿼리를 생성 할 수 없습니다. 즉 where 절에 두 표현식을 어떻게 배열했는지 상관없이 항상은 @foo를 한 번만 증분합니다.

2

이 시도 :

AND (if(last_name is null,1, sp.last_name 
LIKE CONCAT('%',last_name,'%'))) 
+0

'last_name은 NULL OR ...이 아닌가?'불필요한가? –

+0

'불필요한'이란 무엇을 의미합니까? 방금 코드를 다시 사용했습니다. – jcho360

+0

불필요하게 중복되고 불필요하게 반복적이라는 뜻입니다. –