2009-10-28 9 views
2

Nitpicker 질문 :SQL 데이터베이스에 항목이 있는지 빠르게 확인하십시오.

테이블에 항목이 있는지 확인하기 위해 부울을 반환하는 기능이 있습니다. 그리고 이것을 많이 호출해야하기 때문에 최적화가 필요합니다.

Iues MySQL은 지금,하지만

그래서 내가

select id from table where a=b limit 1; 

또는

select count(*) as cnt from table where a=b; 

또는 뭔가 completly 다른를 사용해야합니다 ... 아주 기본적인해야 하는가?

제한 검색은 첫 번째 검색 후에 중지해야하며 count (*)는 모든 항목을 검사해야한다고 생각합니다. 따라서 SELECT가 더 빨라질 수 있습니다.

가장 간단한 것은 루프를 반복하여 테스트하는 것이지만 테스트는 도움이되지 않습니다. (내 테스트 시스템은 다른 방법으로도 사용되는 것처럼 보입니다.)

+0

두 경우 모두 'a'에 색인이 있어야합니다. –

+0

@ 브렛 : 그 말을하기에는 정보가 충분하지 않습니다. 'a'가 3 개의 가능한 값을 갖는 열거 형 상수 인 경우, 인덱스를 사용하면 성능이 향상되지 않습니다. – Andomar

답변

1

한계 1은 MySQL이 한 행을 찾은 후 검색을 중지하도록 알려줍니다. 기준과 일치하는 행이 여러 개일 수있는 경우 count (*)보다 빠릅니다.

최적화 방법은 더 많지만 정확한 특성은 행의 양과 a와 b의 분포에 따라 달라집니다. 나는 성능 문제가 실제로 발생할 때까지 "where a = b"방식으로 접근 할 것입니다. 데이터베이스는 너무 빨라 대부분의 쿼리는 성능 문제가 전혀 없습니다.

3

이 "필요"는 종종 INSERT 또는 UPDATE 할 때 상황을 나타냅니다. 두 가지 가장 일반적인 상황은 대량로드/행 업데이트 또는 히트 카운팅입니다.

첫 번째 행 존재 확인은 INSERT ... ON DUPLICATE KEY UPDATE 문을 사용하여 피할 수 있습니다. 히트 카운터의 경우 단 하나의 명령문 만 필요합니다. 대량로드의 경우 데이터를 임시 테이블에로드 한 다음 임시 테이블을 소스로 사용하여 INSERT ... ON DUPLICATE KEY UPDATE을 사용하십시오.

그러나 이것을 사용할 수 없다면, force index과 함께 가장 빠른 방법은 select id from table where a=b limit 1;이고, 인덱스에서만 mysql이 보이도록하십시오.

+0

+1 하나의 명령문을 사용하면 트랜잭션이 가능하다는 장점이 있습니다. 별도의 SELECT에 존재 여부를 확인하면 SELECT와 INSERT 사이에 행이 추가 될 수 있습니다. – Andomar

+0

일반 SQL에 대한 좋은 조언이지만, 필자는 응용 프로그램 논리에서 직접 수행해야하는 필요에 따라 고유하지 않은 orm을 사용합니다. 그리고 존재 여부에 대한 점검도없는 것 같습니다. 이렇게 좋은 답변입니다. 내가 원했던 것이 아니더라도. – WegDamit

+0

내 대답이 업데이트되었습니다. – longneck

관련 문제