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
'programing' 카테고리의 다른 글
페이지를 닫을 때(남기지 않을 때) 언로드하기 전에 jquery? (0) | 2023.08.29 |
---|---|
jquery, ID 내 클래스 선택기 (0) | 2023.08.29 |
SQL 조인 후 쿼리된 테이블에서 데이터 제외 (0) | 2023.08.29 |
ADB 장치를 찾을 수 없음 (0) | 2023.08.29 |
C에서 2차원 배열의 요소에 액세스하기 위해 포인터 표현을 사용하는 방법은 무엇입니까? (0) | 2023.08.29 |