2016-11-30 1 views
2

작동하는 쿼리가 있지만 속도가 느립니다. 이 속도를 높이는 방법이 있습니까? 기본적으로 나는 타임 카드 항목을 가진 테이블을 가지고 있고, 타임 코드에 의해 관련이있는 해당 항목의 시간 분석을 가진 두 번째 테이블을 가지고있다. 내가 찾고있는 것은 고장이 없다는 것입니다. 기준을 2 개월로 줄이면 속도가 빨라질 것이라고 생각했습니다. 감사합니다 당신의 도움이NOT EXISTS 조건의 쿼리 속도 문제

SELECT * FROM Timecards 
WHERE NOT EXISTS (SELECT TimeCardID FROM TimecardBreakdown WHERE Timecards.ID = TimecardBreakdown.TimeCardID) 
AND Status <> 0 
AND DateIn >= CURRENT_DATE() - INTERVAL 2 MONTH 
+0

DB에서 B 또는 B + 트리를 더 잘 인덱싱하십시오. –

+0

어떻게해야합니까? – user3338040

+1

관련 테이블의 전체 정의를 포함하도록 쿼리를 최적화하는 데 도움을 요청하는 것이 일반적입니다. 쿼리를위한'EXPLAIN'의 출력 또한 편리합니다. –

답변

2

것은 당신이 왼쪽 외부를 사용하여 가입 할 수있는 경우에 TimecardBreakdown 테이블에 존재하지 않는 TimecardIDs을 알고 싶은 것 같다.

SELECT a.* 
FROM Timecards a 
LEFT OUTER JOIN TimecardBreakdown b ON a.TimecardID = b.TimecardID 
WHERE b.TimecardID IS NULL 

이렇게하면 값이 비싼 하위 쿼리가 제거되고 더 효율적으로 조인을 사용하게됩니다.

+0

귀하의 솔루션을 사용했습니다. 도와 줘서 고마워. 대단 했어. 어마 어마하게 빠른. – user3338040

+0

그것은 당신을 도왔다 기쁘다, upvote 주셔서 감사하고 대답을 수락하십시오. :-) –

0

MySQL이 상관 관계가있는 서브 쿼리를 빠르게 처리합니다. 하위 쿼리를 독립적으로 만들고 결합하십시오. LEFT JOIN ... IS NULL 패턴을 사용하여 WHERE NOT EXISTS을 대체 할 수 있습니다.

SELECT tc.* 
    FROM Timecards tc 
    LEFT JOIN TimecardBreakdown tcb ON tc.ID = tcb.TimeCardId 
WHERE tc.DateIn >= CURRENT_DATE() - INTERVAL 2 MONTH 
    AND tc.Status <> 0 
    AND tcb.TimeCardId IS NULL 

일부 최적화 지점.

먼저 tc.Status <> 0tc.Status > 0으로 변경할 수 있으면 해당 열에서 인덱스 범위를 검색 할 수 있습니다.

둘째, 물건을 최적화 할 때 SELECT *은 유해한 것으로 간주됩니다. 대신 필요한 열의 이름을 줄 수 있다면 더 빨리 처리 할 수 ​​있습니다. 데이터베이스 서버는 요청하는 모든 데이터를 처리해야합니다. 당신이 그 중 일부를 무시할 지 여부는 알 수 없습니다.

셋째,이 쿼리는 복합 인덱스가 Timecards (DateIn, Status, ID) 인 경우 도움이됩니다. 이 복합 색인은 조회 조건 만족에 많은 도움이됩니다.

색인을 다루는 이라고합니다. 여기에는 많은 쿼리를 충족시키는 데 필요한 데이터가 포함되어 있습니다. DateIn 열에 대해서만 인덱싱을 수행하려는 경우 쿼리 처리기는 StatusID 값을 찾기 위해 주 테이블로 되돌아 와야합니다. 해당 열이 인덱스에 나타나면 추가 작업을 저장합니다.

을 수행하는 대신 특정 열 집합을 SELECT으로 지정하면 포함 인덱스의 열을 포함하여 쿼리 성능이 크게 향상 될 수 있습니다. 이는 SELECT *이 해로운 것으로 여겨지는 몇 가지 이유 중 하나입니다.

. (일부 차종과 DBMS의 모델은 실제로 색인하지 않고 인덱스에 함께 타고 열 목록을 지정하는 방법이 MySQL은 그 색인에 당신을 필요로하지만, 커버 인덱스는 여전히 도움이됩니다..)

이 읽기 ​​: http://use-the-index-luke.com/