2017-12-16 3 views
1

총 수 = 12 000쿼리 최적화 테이블의 레코드

난 단지 최근에 또는 마지막에 추가 기록 인 10 개 개의 레코드를 필요로하는 쿼리 아래에 있습니다. 따라서 OrderBy desc를 적용하지만 입찰가로 ORDER BY를 사용하여 DESC를 적용하면 쿼리가 중지되고 쿼리가 10 개의 레코드에 대해 15 분의 출력을 반환합니다.

SELECT taking.BId ,taking.calledDate Called,taking.calleduser Caller,taking.callerNotes,taking.Title, 
taking.FName,taking.ScName,taking.takingPhase, Training.TName, 
taking.TrDate,taking.SubmitDateTime, TrLocation.TrLocation trTrl, 
taking.STATUS,taking.DelegNum, taking.Tel, taking.Email,taking.Notes 
FROM Taking taking 
LEFT JOIN training Training ON taking.Training = Training.TId 
LEFT JOIN confirmation ON taking.Bid = confirmation.Bid 
LEFT JOIN TrLocation ON taking.TrLocation = TrLocation.TrLId 
LEFT JOIN Invoice ON taking.BId =Invoice.BId 
LEFT JOIN couriertracking ON taking.BId = couriertracking.bId 
LEFT JOIN SalesPerson ON taking.SId = SalesPerson.SId WHERE 
taking.SubmitDateTime > DATE_SUB(NOW(), INTERVAL 2 MONTH) AND IFNULL(taking.SId,0) > 0 
ORDER BY taking.BId DESC LIMIT 10 

입찰 열에서 색인 생성을 시도했지만 여전히 쿼리 시간이 같습니다. 어떻게하면 쿼리를 최적화 할 수 있습니까?

+0

'ORDER BY' 및'LIMIT'을 (를) 제거하면 얼마나 많은 행을 가지며 시간이 얼마나 걸립니까? –

+0

재생 해 주셔서 감사합니다. ORDER BY 및 LIMIT을 (를) 제거한 후 약 11,533 개의 레코드가 반환됩니다. – Aartek

+0

'ORDER BY'와'LIMIT'은 SQL 연산의 마지막 단계 중 하나입니다. 아마도 전체 결과 집합이 처리되고 마지막 명령이 결과 집합을 정렬하고 잘라냅니다. 조인 필드를 인덱싱하십시오. – Parfait

답변

1

LEFT JOIN 만 있고 LEFT JOIN은 더 많은 행을 추가 할 수 있으므로 하위 쿼리를 사용하여 Taking 테이블에서 반환 된 행 수를 제한 할 수 있습니다. 다음 10 개의 행만 다른 테이블과 조인해야합니다. JOIN이 더 많은 행을 추가 할 경우 외부 쿼리에서 다른 LIMIT를 계속 사용할 수 있습니다. taking.SId > 0가 WHERE 절 IFNULL(taking.SId,0) > 0에서와 동일한 효과가

SELECT 
    taking.BId,taking.calledDate Called, taking.calleduser Caller, 
    taking.callerNotes, taking.Title, taking.FName, taking.ScName, 
    taking.takingPhase, Training.TName, taking.TrDate, 
    taking.SubmitDateTime, TrLocation.TrLocation trTrl, taking.STATUS, 
    taking.DelegNum, taking.Tel, taking.Email,taking.Notes 
FROM (
    SELECT taking.* 
    FROM Taking taking 
    WHERE taking.SubmitDateTime > DATE_SUB(NOW(), INTERVAL 2 MONTH) 
     AND taking.SId > 0 
    ORDER BY taking.BId DESC 
    LIMIT 10 
) taking 
LEFT JOIN training Training ON taking.Training = Training.TId 
LEFT JOIN confirmation ON taking.Bid = confirmation.Bid 
LEFT JOIN TrLocation ON taking.TrLocation = TrLocation.TrLId 
LEFT JOIN Invoice ON taking.BId =Invoice.BId 
LEFT JOIN couriertracking ON taking.BId = couriertracking.bId 
LEFT JOIN SalesPerson ON taking.SId = SalesPerson.SId 
ORDER BY taking.BId DESC 
LIMIT 10 

참고. NULLSId 인 행은 해당 조건과 일치하지 않습니다.

그러나 모든 테이블의 조인에 사용되는 모든 열에 인덱스가 있는지 확인해야합니다. 이 쿼리를 들어 당신은

  • Training.TId
  • confirmation.Bid
  • TrLocation.TrLId
  • Invoice.BId
  • couriertracking.bId
  • SalesPerson.SId

의 일부에 인덱스가 필요합니다 그들은 기본 키처럼 보입니다. 그렇다면 색인을 생성 할 필요가 없습니다.

Taking 테이블에 가장 적합한 인덱스를 찾는 것이 그렇게 간단하지 않습니다. 그러나 12K 행은 그다지 크지 않습니다. SubmitDateTime에 대한 색인 만 있으면됩니다.

+0

귀중한 의견을 보내 주셔서 감사합니다. 이제 6 밀리 초 내에 쿼리 응답. 정말 고맙습니다. – Aartek