programing

Count(*)>0보다 효율적으로 존재합니까?

randomtip 2023. 8. 29. 22:35
반응형

Count(*)>0보다 효율적으로 존재합니까?

MySQL 5.1을 사용하고 있는데 대략 다음과 같은 형식의 쿼리가 있습니다.

select count(*) from mytable where a = "foo" and b = "bar";

제 프로그램에서 확인하는 것은 이것이 0인지 0이 아닌지 뿐입니다.이 값을 다음으로 변환할 경우:

select exists(select * from mytable where a = "foo" and b = "bar");

MySQL은 첫 번째 SQL에 도달했을 때 검색을 멈출 정도로 똑똑합니까?또는 MySQL과 통신할 수 있는 다른 방법이 있습니까? MySQL과 일치하는 레코드가 있는지 확인하는 것뿐이며 정확한 개수는 필요하지 않습니다.

예, 존재 함수를 사용할 때 행이 반환되면 MySQL(내가 알기로는 모든 데이터베이스 시스템)이 처리를 중지합니다.

자세한 내용은 MySQL 설명서를 참조하십시오.하위 쿼리가 행을 반환하는 경우, 존재 하위 쿼리는 TRUE입니다.

나는 1000개의 쿼리로 테스트를 실행했습니다.SELECT EXISTS보다 약 25% 더 빨랐습니다.SELECT COUNT추가 중limit 1로.SELECT COUNT차이가 없었습니다.

가장 신뢰할 수 있는 방법은 아마도LIMIT 1,하지만 요점은 그게 아니다.

다음과 같은 색인이 있다면,CREATE INDEX mytable_index_a_b ON mytable (a,b)MySQL은 인덱스에서 카운트를 반환하고 행을 전혀 건드리지 않을 정도로 똑똑해야 합니다.LIMIT 1의 이점은 아마도 무시해도 될 것입니다.

만약 당신이 (a,b)에 대한 색인을 가지고 있지 않다면, 성능은 형편없을 것입니다.LIMIT 1은 훨씬 덜 끔찍하게 만들 수 있지만, 여전히 끔찍할 것입니다.

이것도 하나의 방법일 수 있습니다.

select 1 from mytable where a = "foo" and b = "bar" limit 1;

이는 where 조건을 충족하는 모든 레코드를 추적하지 않고 첫 번째 'hit' 후에 '1'을 반환합니다.단점은 결과를 확인해야 한다는 것입니다. 반환되는 레코드가 비어 있을 수 있기 때문입니다.

이것이 최적화에 얼마나 효과가 있는지는 모르겠지만 기능적으로는 다음과 같아야 합니다.exists일치하는 행이 없는 경우 행을 반환하지 않는 경우는 예외입니다.

SELECT true from mytable where a = "foo" and b = "bar" LIMIT 1;

언급URL : https://stackoverflow.com/questions/5264658/is-exists-more-efficient-than-count0

반응형