2014-10-13 2 views
0

다음 mysql 쿼리를 실행하는 데 40 초가 걸렸습니다. 너무 많습니다.느린 mysql 쿼리를 최적화

어떻게 최적화 할 수 있습니까?

SELECT 
    downloads.*, 
    COUNT(DISTINCT comment.id) AS commentsNum, 
    AVG(users_votes.rate) AS score, 
    COUNT(DISTINCT users_votes.id) AS rateNum, 
    COUNT(DISTINCT users_download.id) AS downloadsNum 
FROM downloads 
LEFT JOIN (
    SELECT * FROM comment WHERE type='download' 
) comment ON downloads.id = comment.typeID 
LEFT JOIN (
    SELECT * FROM users_votes WHERE section='download' AND rate>0 
) users_votes ON downloads.id = users_votes.voteID 
LEFT JOIN (
    SELECT id,downloadID FROM users_download GROUP BY userID,downloadID 
) users_download ON downloads.id = users_download.downloadID 
GROUP BY downloads.id 

의 결과는 내용 설명 : 당신은 그룹 결과에 download_id으로 가입 설정해야

enter image description here

+0

@FatihK 어떻게해야합니까 :) 것으로 분석? –

+0

'downloads.id' 열에 대한 색인이 생성됩니까? fk로 사용할 때 indexex인가? (예 :'users_download.downloadID')? – Paolo

+0

@Paolo 네, 기본 키입니다 –

답변

1

.

SELECT 
    downloads.*, 
    comment.commentsNum, 
    users_votes.AvgScore, 
    users_votes.rateNum, 
    users_download.downloadsNum 
FROM downloads 
LEFT JOIN (
    SELECT TypeID,COUNT(*) AS commentsNum FROM comment WHERE type='download' GROUP BY TypeID 
) comment ON downloads.id = comment.typeID 

LEFT JOIN (
    SELECT voteID,AVG(rate) AS AvgScore,COUNT(*) AS rateNum FROM users_votes WHERE section='download' AND rate > 0 GROUP BY voteID 
) users_votes ON downloads.id = users_votes.voteID 

LEFT JOIN (
    SELECT downloadID,COUNT(userID) AS downloadsNum FROM users_download GROUP BY downloadID 
) users_download ON downloads.id = users_download.downloadID 
1

귀하의 설명에 따르면 users_download 테이블이 원인입니다. 쿼리는 해당 테이블에서 100,000 개의 행을 스캔하도록 강제됩니다. 인덱스를 사용하지 않는 것과 조합하여 GROUP BY을 사용하고 있기 때문에 쿼리를 수행하고 있습니다.

"파일 포트 사용"은 정렬 할 수 있도록 테이블의 일부를 디스크에 기록해야하기 때문에 경고 기호입니다 (그룹화를 다시 할 수 있음). 디스크는 우리 모두가 알고 있듯이 매우 느립니다.

정확히 무엇을 하려는지 확실하지 않지만 GROUP BY은 종종 비싸므로 GROUP BY을 사용하지 않고 쿼리를 다시 작성할 수 있다면 성능이 좋을 수 있습니다. 그렇지 않으면 테이블의 큰 부분을 스캔하지 않고 MySQL이 올바른 행을 찾을 수 있도록 색인을 작성하십시오.

0

최적화 된 쿼리입니다

왜이 쿼리가 매우 빠르게 실행됩니까?

하지만 이전 쿼리는 매우 느리게 실행됩니까?

전문 프로그래머는

SELECT 
    downloads.*, 
    comment.commentsNum AS commentsNum, 
    users_votes.AvgScore AS score, 
    users_votes.rateNum AS rateNum, 
    users_download.downloadsNum AS downloadsNum 
FROM downloads 
LEFT JOIN (
    SELECT typeID,COUNT(id) AS commentsNum FROM comment WHERE type='download' GROUP BY typeID 
) comment ON downloads.id = comment.typeID 

LEFT JOIN (
    SELECT voteID, AVG(rate) AS AvgScore,COUNT(id) AS rateNum FROM users_votes WHERE section='download' AND rate > 0 GROUP BY voteID 
) users_votes ON downloads.id = users_votes.voteID 

LEFT JOIN (
    SELECT id,downloadID,COUNT(id) AS downloadsNum FROM users_download WHERE id IN (SELECT MIN(id) FROM users_download GROUP BY userID,downloadID) GROUP BY downloadID ORDER BY downloadID 
) 
users_download ON downloads.id = users_download.downloadID 
관련 문제