2010-04-14 2 views
2

많은 양의 데이터를 반환하고 여러 조인이 필요한 레코드를 데이터베이스에서 가져 오려고한다고 가정합니다.DB에 레코드가 있는지 확인 : 한 단계 또는 두 단계?

그럼 내 질문에 데이터가 있는지 확인하고 존재하는 경우 결과를 얻는 것이 더 나은가? 또는 데이터가 존재하는지 확인하기 위해보다 간단한 쿼리를 수행하여 ID 레코드가 존재하는지 확인하고 다시 쿼리하여 결과가 있음을 알 수 있습니다.

예 :

3 표 A, B 및 AB (접속점 테이블)

select * from 
from a, b, ab 
where condition 
and condition 
and condition 
and condition etc... 

또는

select id 
from a, b ab 
where condition 

는 경우 상기 조회를 수행 존재한다.

두 번째 작업을 수행 할 이유가 있는지 알 수 없습니다. 어떤 아이디어가 이것이 DB 성능에 어떤 영향을 미치는지 또는 전혀 문제가되지 않습니까?

답변

3

일반적으로 쿼리에서 가장 느린 부분은 필터입니다. 그러면 인덱스 된 검색, 조인 등입니다. 많은 양의 데이터가 전송되는 경우에도 전송에 많은 시간이 소요됩니다. 존재를 확인한 다음 데이터를 추출하면 속도가 두 배 느려집니다. 그냥 데이터를 추출하십시오. 그것이 있다면 당신은 그것을 얻습니다. 그렇지 않다면 당신은 아무것도 얻지 못합니다.

여러 테이블에서 추출 할 때 JOIN은 더 빠르고 유연합니다.

0

런타임과 관련하여 고려해야 할 또 다른 참고 사항입니다. select 문에서 '*'를 사용하지 마십시오. 단순한 메모 일 수도 있지만 쿼리의 런타임에 직접적인 영향을줍니다. select 문을 업데이트하고 별칭을 사용하고 u'r 키를 색인화하고 필요한 필드 만 선택하십시오.

1

결과는 페이지 매김 또는 캐시되어야 할 때 일반적으로 "두 가지 쿼리"방식을 선호합니다. 예를 들어 첫 번째 쿼리는 ID의 잠재적 긴 목록을 반환 할 수 있기 때문에

$found_ids = "select id from products where ...complex $condition...." 

maybe add to cache ($condition => $found_ids) 

$ids_to_show = array_slice($found_ids, $_GET['page'], $pagesize); 

$data = "select * from products, more tables ... where products.id IN($ids_to_show)"; 

, 그것은 그들 모두에 대한 데이터를 가져 오기 위해 상당한 시간 낭비가 될 것입니다.