아래 last_name이 NULL이면 성능을 높이기 위해 해당 열의 WHERE 비교를 건너 뛸 것인가?MySQL 및 WHERE 절을 건너 뜁니다
AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%'))
아래 last_name이 NULL이면 성능을 높이기 위해 해당 열의 WHERE 비교를 건너 뛸 것인가?MySQL 및 WHERE 절을 건너 뜁니다
AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%'))
MySQL은 어느 순서로든 비교를 수행 할 수 있습니다.
가장 빨리 계산하기 때문에 NULL
검사를 먼저 수행 할 가능성이 높지만 이는 보장 할 수 없습니다.
우연히 NULL을 선택하면 두 번째 비교를 건너 뜁니 까? –
호기심에서 피하고있는 것처럼 보이는 더 간단한'WHERE sp.last_name LIKE CONCAT ('%', last_name, '%'))을 시도해 보셨습니까? 그것은 당신이 두려워하는만큼 느리지는 않다는 것을 알 수 있습니다 ... –
나는 쿼리 시간이 약간 증가했습니다. –
필자가 아는 한, 사실입니다. 후자의 표현을 평가하지 않고 행을 포함하게됩니다. 그러나 후자의 표현식이 부울 효과 (예 : 카운터 증가)를 생성하고 last_name 열에 NULL 만있는 데이터 세트에 대해 실행되기 전과 후에 카운터를 검사함으로써 알려진 데이터 세트로 테스트 할 수 있습니까?
:
+------+
| 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를 한 번만 증분합니다.
이 시도 :
AND (if(last_name is null,1, sp.last_name
LIKE CONCAT('%',last_name,'%')))
'last_name은 NULL OR ...이 아닌가?'불필요한가? –
'불필요한'이란 무엇을 의미합니까? 방금 코드를 다시 사용했습니다. – jcho360
불필요하게 중복되고 불필요하게 반복적이라는 뜻입니다. –
이라고 "단락"평가. 검색하면 더 많은 결과를 얻을 수 있습니다. –
나는 아래의 나의 대답에 관심의 대상이 될 수있는 몇 가지 검사를 실시했다. –
나는 매우 흥미로운 것을 보았다. –