2015-02-07 3 views
0

올바르게 작동하는 쿼리를 작성했습니다. 그러나 실행하는 데 더 많은 시간이 걸립니다. 현재 쿼리를 어떻게 최적화 할 수 있는지 이해할 수 없습니다.현재 MySQL 쿼리를 최적화하는 방법

여기에는 수천만 개의 데이터가 포함됩니다. 싫어하는 표는 모든 사용자가 좋아하거나 싫어하는 행을 삽입합니다.

내 쿼리 :

select i.id,i.category,i.url,i.upload_by,i.upload_date, 
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id) AS 'allLike', 
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '1' DAY) AS 'daytotalLike', 

(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '7' DAY) AS '7daytotalLike', 
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '30' DAY) AS '30daytotalLike', 
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '90' DAY) AS '90daytotalLike', 
i.status from `image` as i, `like_dislike` as likeDislike 
WHERE i.status='approved' and i.id=likeDislike.imageid and FROM_UNIXTIME(likeDislike.performdate)>= NOW() - INTERVAL '90' DAY 
    GROUP BY i.id ORDER BY '90daytotalLike' DESC Limit 50 

sqlfiddle Demo

+0

'CREATE TABLE' 문을 여기에 추가하고 색인을 추가 할 수 있습니까? 이 SQL을 포맷하여 더 넓은 구조를 볼 수있게하는 것이 더 낫습니다. 독자의 삶을 편하게 만듭니다. 사람들이 함께 즐길 수있는 SQL Fiddle을위한 업 보봇 (upvotes). – halfer

+0

또한 각 테이블의 행 수와 쿼리 실행 시간 (대략)을 알려주십시오. 설명 계획을 생성 할 수 있다면 도움이 될 것입니다. – halfer

+0

@halfer sqlfiddle 데모가 추가되었습니다. –

답변

0

대답은 간단하다 : 당신은 하나 개의 질의에 너무 많은 일을하려고합니다. 내가 알 수있는 한, 50 명의 사용자가 많은 변수에서 가장 높은 점수를 가진 모든 사용자를 알고 싶습니다. 그래, 미안, 네가 여기서 뭘하려고하는지 약간 불분명하다.

그래서 모든 하위 쿼리를 제거하고 하나의 기본 쿼리를 남겨 둡니다. 예 :

SELECT 
    count(*) as 90daytotalLike, 
    image.id, 
    image.category, 
    image.url, 
    image.upload_by, 
    image.upload_date, 
    image.status 
FROM 
    image, 
    like_dislike 
WHERE 
    like_dislike.ulike = 1 AND 
    image.category != 4 AND 
    image.status = 'approved' AND 
    image.id = like_dislike.imageid AND 
    FROM_UNIXTIME(like_dislike.performdate) >= NOW() - INTERVAL '90' DAY 
GROUP BY image.id 
ORDER BY '90daytotalLike' DESC Limit 50 

다른 기간의 데이터를 알아야 할 경우 별도의 쿼리를 실행하십시오.

데이터베이스의 부하를 줄이는 또 다른 방법은 전체 좋아하는 것을 사용자와 함께 데이터베이스에 저장하는 것입니다. 단순한 카운터 일 뿐이지 만 멋진 것은 아니지만 항상 좋아하는 사람을 요약해야합니다.

마침표를 사용할 수도 있습니다. 투표가 만료되면 각 카운터를 간단히 업데이트 할 수 있습니다.

관련 문제