느린 MySQL 쿼리, EXPLAIN은 임시 사용을 보여줍니다. 파일 정렬 사용

swdee

이 쿼리 :

EXPLAIN SELECT ppi_loan.customerID,
               loan_number,
               CONCAT(forename, ' ', surname) AS agent,
               name,
               broker,
              (SELECT timestamp
               FROM ppi_sar_status
               WHERE history = 0
                   AND (status = 10 || status = 13)
                   AND ppi_sar_status.loanID = ppi_loan.loanID) AS ppi_unsure_date,
              fosSent,
              letterSent,
              (SELECT timestamp
               FROM ppi_ques_status
               WHERE status = 1 
                   AND ppi_ques_status.loanID = ppi_loan.loanID
               ORDER BY timestamp DESC LIMIT 1) AS sent_date,
               ppi_ques_status.timestamp
FROM ppi_loan
LEFT JOIN ppi_assignments ON ppi_assignments.customerID = ppi_loan.customerID
LEFT JOIN italk.users ON italk.users.id = agentID
LEFT JOIN ppi_ques_status ON ppi_ques_status.loanID = ppi_loan.loanID
JOIN ppi_lenders ON ppi_lenders.id = ppi_loan.lender
JOIN ppi_status ON ppi_status.customerID = ppi_loan.customerID
JOIN ppi_statuses ON ppi_statuses.status = ppi_status.status
   AND ppi_ques_status.status = 1
   AND ppi_ques_status.history = 0
   AND (cc_type = '' || (cc_type != '' AND cc_accepted = 'no'))
   AND ppi_loan.deleted = 'no'
   AND ppi_loan.customerID != 10
GROUP BY ppi_loan.customerID, loan_number

매우 느립니다. 다음은 EXPLAIN 쿼리의 모든 결과입니다.

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY ppi_ques_status ref loanID,status,history   status  3   const   91086   Using where; Using temporary; Using filesort
1   PRIMARY ppi_loan    eq_ref  PRIMARY,customerID  PRIMARY 8   ppimm.ppi_ques_status.loanID    1   Using where
1   PRIMARY ppi_lenders eq_ref  PRIMARY PRIMARY 4   ppimm.ppi_loan.lender   1   Using where
1   PRIMARY ppi_assignments eq_ref  customerID  customerID  8   ppimm.ppi_loan.customerID   1   
1   PRIMARY users   eq_ref  PRIMARY PRIMARY 8   ppimm.ppi_assignments.agentID   1   
1   PRIMARY ppi_status  ref status,customerID   customerID  8   ppimm.ppi_loan.customerID   6   
1   PRIMARY ppi_statuses    eq_ref  PRIMARY PRIMARY 4   ppimm.ppi_status.status 1   Using where; Using index
3   DEPENDENT SUBQUERY  ppi_ques_status ref loanID,status   loanID  8   func    1   Using where; Using filesort
2   DEPENDENT SUBQUERY  ppi_sar_status  ref loanID,status,history   loanID  8   func    2   Using where

너무 많은 행을 스캔하는 이유와 "임시 사용, 파일 정렬 사용"이유는 무엇입니까? 생성되는 모든 결과가 필요하므로 하위 쿼리를 제거 할 수 없습니다.

그림자

주석에서 이미 언급했듯이 느린 쿼리의 주된 원인은 단일 열 인덱스 만있는 것처럼 보이지만 조인, 필터 및 그룹화 기준을 포함하려면 다중 열 인덱스가 필요하기 때문입니다.

또한 쿼리에는 두 가지 다른 문제가 있습니다.

  1. group by2 개의 필드에만있는 경우에도 .NET select과 같은 집계 함수의 적용을받지 않고 다른 여러 필드가 목록에 나열 됩니다 min(). MySQL은 이러한 쿼리가 특정 SQL 모드 설정에서 실행되도록 허용하지만 여전히 SQL 표준에 위배되며 실제로 수행중인 작업을 알지 않는 한 예기치 않은 부작용이 발생할 수 있습니다.

  2. ppi_loan의 왼쪽 테이블 인 조인 조건 테이블에 대한 필터가 있습니다 left join. 왼쪽 조인의 특성으로 인해 이러한 레코드는 결과 집합에서 제거되지 않지만 MySQL은 해당 레코드의 값을 조인하지 않습니다. 이러한 기준은 where조항 으로 이동해야합니다 .

내가 만들 인덱스 :

  • ppi_sar_status : loanID, status, history 필드에 대한 다중 열 인덱스-이 테이블이 없기 때문에 조인 섹션으로 이동하는 것이 좋습니다.

  • ppi_ques_status : loanID, status, timestamp 필드의 다중 열 인덱스-하위 쿼리와 조인을 모두 지원합니다. 하위 쿼리에는 Explain에 파일 정렬도 있습니다.

  • ppi_loan : 최소한 customerID에 대한 다중 열 인덱스, loan_number 필드는 group by을 지원하므로 파일 정렬을 최소한으로 피합니다. 이 인덱스에 대한 선택성을 기반으로 조인 기준에 다른 필드를 추가하는 것을 고려할 수 있습니다.

또한 조인에서 값을 검색하지 않기 때문에 마지막 2 개의 상태 테이블이있는 이유도 잘 모르겠습니다. 이러한 테이블을 사용하여 특정 레코드를 제거 exists()하는 경우 조인 대신 하위 쿼리를 사용하는 것이 좋습니다. 조인에서 MySQL은 조인 된 모든 테이블에서 데이터를 가져와야하는 반면, exists()하위 쿼리에서는 기본 테이블에서 실제 데이터를 검색하지 않고 결과 집합에 최소 1 개의 레코드가 있는지 확인합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

EXPLAIN 출력을 사용하여 느린 MySQL 쿼리 최적화

분류에서Dev

MySQL 느린 하위 쿼리, JOIN을 사용해야합니까?

분류에서Dev

임시 사용으로 MySQL 정렬; 파일 정렬 사용

분류에서Dev

파일 정렬을 사용하여 MySql GROUP BY-쿼리 최적화

분류에서Dev

MySQL 느린 쿼리-Filesort 사용

분류에서Dev

EF를 사용하여 합계를 사용하는 느린 mysql 쿼리

분류에서Dev

MySQL은 Explain으로 느린 쿼리를 최적화합니다.

분류에서Dev

WordPress에서 사용자 정의 mysql 쿼리를 사용하여 meta_key로 게시물을 정렬하는 방법은 무엇입니까?

분류에서Dev

HAVING 절을 사용한 느린 쿼리-속도를 높일 수 있습니까?

분류에서Dev

GROUP BY AND ROLLUP을 사용하여 MySQL 쿼리의 출력을 다시 정렬하려면 어떻게합니까?

분류에서Dev

MySQL은 파일 정렬을 사용하고 성능이 저하됩니다.

분류에서Dev

느린 부팅 후 시스템 파일 검사기를 사용하여 Windows 10 수정

분류에서Dev

LIMIT에도 불구하고 사용자 정의 함수를 사용하는 MySQL 매우 느린 쿼리

분류에서Dev

장고 쿼리 셋을 사용하여 다 대일 필드의 값으로 정렬 하시겠습니까?

분류에서Dev

MySQL 느린 쿼리 : datetime 별 정렬

분류에서Dev

InnoDB 테이블을 사용하여 느린 MySQL UPDATE 쿼리 속도를 높이는 방법

분류에서Dev

GROUP BY를 사용하는 MySQL의 매우 느린 하위 쿼리

분류에서Dev

선택 알고리즘을 사용하여 시간 재귀 정렬 컴파일

분류에서Dev

MySQL EXPLAIN은 사용되지 않는 키를 보여줍니다. 전혀 아무것도하지 않습니까?

분류에서Dev

비디오 재생 변경은 FFMPEG android java 사전 컴파일 라이브러리를 사용하여 매우 느린 프로세스입니다.

분류에서Dev

Windows 임시 파일은 많은 공간을 사용합니다.

분류에서Dev

와일드 카드를 사용한 느린 조인 쿼리

분류에서Dev

많은 요소가 느린 사용자 지정 segued보기

분류에서Dev

Perl을 사용하는 임시 파일로 정리 실패

분류에서Dev

MySQL-쿼리의 일부로 파일 이름을 사용하는 방법은 무엇입니까?

분류에서Dev

Java 및 Hibernate를 사용하여 MySQL 쿼리를 특정 열로 정렬하는 방법은 무엇입니까?

분류에서Dev

Regex를 사용하는 AWS Cloudwatch Log Insights 쿼리는 MySql 느린 쿼리 로그에 대한 열을 추출하지 않습니다.

분류에서Dev

MATCH AGAINST와 함께 OR을 사용하는 MySQL은 쿼리를 크게 느리게합니다.

분류에서Dev

정규식을 사용하여 미디어 쿼리의 시작과 끝을 일치하지만 중간 내용은 일치하지 않습니다.

Related 관련 기사

  1. 1

    EXPLAIN 출력을 사용하여 느린 MySQL 쿼리 최적화

  2. 2

    MySQL 느린 하위 쿼리, JOIN을 사용해야합니까?

  3. 3

    임시 사용으로 MySQL 정렬; 파일 정렬 사용

  4. 4

    파일 정렬을 사용하여 MySql GROUP BY-쿼리 최적화

  5. 5

    MySQL 느린 쿼리-Filesort 사용

  6. 6

    EF를 사용하여 합계를 사용하는 느린 mysql 쿼리

  7. 7

    MySQL은 Explain으로 느린 쿼리를 최적화합니다.

  8. 8

    WordPress에서 사용자 정의 mysql 쿼리를 사용하여 meta_key로 게시물을 정렬하는 방법은 무엇입니까?

  9. 9

    HAVING 절을 사용한 느린 쿼리-속도를 높일 수 있습니까?

  10. 10

    GROUP BY AND ROLLUP을 사용하여 MySQL 쿼리의 출력을 다시 정렬하려면 어떻게합니까?

  11. 11

    MySQL은 파일 정렬을 사용하고 성능이 저하됩니다.

  12. 12

    느린 부팅 후 시스템 파일 검사기를 사용하여 Windows 10 수정

  13. 13

    LIMIT에도 불구하고 사용자 정의 함수를 사용하는 MySQL 매우 느린 쿼리

  14. 14

    장고 쿼리 셋을 사용하여 다 대일 필드의 값으로 정렬 하시겠습니까?

  15. 15

    MySQL 느린 쿼리 : datetime 별 정렬

  16. 16

    InnoDB 테이블을 사용하여 느린 MySQL UPDATE 쿼리 속도를 높이는 방법

  17. 17

    GROUP BY를 사용하는 MySQL의 매우 느린 하위 쿼리

  18. 18

    선택 알고리즘을 사용하여 시간 재귀 정렬 컴파일

  19. 19

    MySQL EXPLAIN은 사용되지 않는 키를 보여줍니다. 전혀 아무것도하지 않습니까?

  20. 20

    비디오 재생 변경은 FFMPEG android java 사전 컴파일 라이브러리를 사용하여 매우 느린 프로세스입니다.

  21. 21

    Windows 임시 파일은 많은 공간을 사용합니다.

  22. 22

    와일드 카드를 사용한 느린 조인 쿼리

  23. 23

    많은 요소가 느린 사용자 지정 segued보기

  24. 24

    Perl을 사용하는 임시 파일로 정리 실패

  25. 25

    MySQL-쿼리의 일부로 파일 이름을 사용하는 방법은 무엇입니까?

  26. 26

    Java 및 Hibernate를 사용하여 MySQL 쿼리를 특정 열로 정렬하는 방법은 무엇입니까?

  27. 27

    Regex를 사용하는 AWS Cloudwatch Log Insights 쿼리는 MySql 느린 쿼리 로그에 대한 열을 추출하지 않습니다.

  28. 28

    MATCH AGAINST와 함께 OR을 사용하는 MySQL은 쿼리를 크게 느리게합니다.

  29. 29

    정규식을 사용하여 미디어 쿼리의 시작과 끝을 일치하지만 중간 내용은 일치하지 않습니다.

뜨겁다태그

보관