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 <> 0
을 tc.Status > 0
으로 변경할 수 있으면 해당 열에서 인덱스 범위를 검색 할 수 있습니다.
둘째, 물건을 최적화 할 때 SELECT *
은 유해한 것으로 간주됩니다. 대신 필요한 열의 이름을 줄 수 있다면 더 빨리 처리 할 수 있습니다. 데이터베이스 서버는 요청하는 모든 데이터를 처리해야합니다. 당신이 그 중 일부를 무시할 지 여부는 알 수 없습니다.
셋째,이 쿼리는 복합 인덱스가 Timecards (DateIn, Status, ID)
인 경우 도움이됩니다. 이 복합 색인은 조회 조건 만족에 많은 도움이됩니다.
색인을 다루는 이라고합니다. 여기에는 많은 쿼리를 충족시키는 데 필요한 데이터가 포함되어 있습니다. DateIn
열에 대해서만 인덱싱을 수행하려는 경우 쿼리 처리기는 Status
및 ID
값을 찾기 위해 주 테이블로 되돌아 와야합니다. 해당 열이 인덱스에 나타나면 추가 작업을 저장합니다.
을 수행하는 대신 특정 열 집합을 SELECT
으로 지정하면 포함 인덱스의 열을 포함하여 쿼리 성능이 크게 향상 될 수 있습니다. 이는 SELECT *
이 해로운 것으로 여겨지는 몇 가지 이유 중 하나입니다.
. (일부 차종과 DBMS의 모델은 실제로 색인하지 않고 인덱스에 함께 타고 열 목록을 지정하는 방법이 MySQL은 그 색인에 당신을 필요로하지만, 커버 인덱스는 여전히 도움이됩니다..)
이 읽기 : http://use-the-index-luke.com/
DB에서 B 또는 B + 트리를 더 잘 인덱싱하십시오. –
어떻게해야합니까? – user3338040
관련 테이블의 전체 정의를 포함하도록 쿼리를 최적화하는 데 도움을 요청하는 것이 일반적입니다. 쿼리를위한'EXPLAIN'의 출력 또한 편리합니다. –