2017-10-16 4 views
0

보고를 위해 함께 통합해야하는 여러 테이블에서 데이터를 가져 오려고합니다. 특정 날짜 이후에 완료된 모든 헤더의 모든 세부 정보를 얻으 려하고 잘못된 데이터로 인해 0 날짜를 확인해야합니다.시간 초과되는 MySQL 쿼리 속도 향상

나는 슬프게도, 만들지 않았고 변경할 수없는 레거시 테이블을 사용하고 있습니다. 이 문은 내 응용 프로그램에서 시간 초과되며 로컬 가상 컴퓨터의 데이터베이스에 대해 실행하는 데 약 40 초가 걸립니다. 더 나은 성능을 위해 쿼리를 리팩토링 할 수 있습니까? 어떤 도움을 주셔서 감사합니다! header를 들어

SELECT detail.* 
FROM detail 
JOIN header 
    ON detail.invoice = header.invoice 
WHERE detail.dateapply != '0000-00-00' 
    AND header.dateapply >= '2017-09-17' 
    AND header.orderstatus IN ('complete', 'backorder') 
ORDER BY detail.DateApply;` 
+0

어떤 필드 유형이'dateapply'입니까? – JNevill

+2

dateapply 및 orderstatus에 대한 색인이 있습니까? – sskoko

+0

정상적인 것은 조인되고 필터링되는 테이블에 적절한 인덱스를 추가하는 것입니다. 하지만 네가 테이블을 바꿀 수 없기 때문에 네가 운이 없다고 생각해? 추가 인덱스가 " – knittl

답변

1

:

INDEX(orderstatus, dateapply) 
INDEX(invoice, orderstatus, dateapply) 

detail 경우 :

INDEX(invoice, dateapply) 
INDEX(dateapply, invoice) 

컬럼의 순서는 의도적이다. 최적화 도구가 어느 테이블에서 시작될 지 알 수 없기 때문에 최적의 방법으로 인덱스를 제공했습니다.

두 개의 dateapply 열이 동기화되면 더 많은 최적화가 이루어질 수 있습니다.

0

동료와 저의 사이에 우리는 결과를 더 빨리 반환하는 아래 쿼리를 제안했습니다. GROUP BY는 중복 레코드를 제거했습니다. 앞으로도 내 문제를 살펴보고 색인을 사용할 가능성을 고대하는 데 시간을내어 주신 모든 분들께 감사드립니다.

SELECT d.* 
FROM detail d 
JOIN header h 
    ON d.invoice = h.invoice 
WHERE d.qbposted = 0 
    AND d.dateapply != '0000-00-00' 
    AND h.dateapply >= '2017-09-17' 
    AND h.orderstatus IN ('complete', 'backorder') 
GROUP BY d.rec ORDER BY d.dateapply;