2012-12-15 4 views
2

두 테이블 companyquestion에서 큰 쿼리를 실행합니다. 두 테이블은 다음과 같은 방법으로 구성되어 있습니다 : 나는 쿼리 실행을 느리게 보인다 하위 쿼리를 방지하기 위해이를 다시 작성하는 방법을 알아 내기 위해 노력 해왔다성능 향상을위한 MySQL 쿼리 개선

company | question 
id  | id 
name  | company_id 
      | sentiment 

SELECT company.id as company_id, company.name, question.sentiment, 
(SELECT count(*) FROM question 
WHERE question.sentiment=0 AND question.company_id=company.id) AS count 
FROM question 
JOIN company ON company.id=question.company_id 
WHERE question.sentiment = 0 GROUP BY company_id ORDER BY count DESC LIMIT 5 

. 질문 표에는 1000 개가 넘는 레코드가 있습니다. 또한 인덱스를 사용하면 실행 시간이 545.037 초에서 180.228 초로 줄어들었지만 여전히 개선해야합니다.

덕분에

+0

시도 '확장 설명'및 최적화 그것으로 무엇을 참조하십시오. 진행 방법에 대한 단서를 줄 수 있습니다. – ethrbunny

+0

느린 쿼리를 진단하려면 설명이나 의역이 아닌 전체 테이블 및 인덱스 정의가 필요합니다. 테이블이 잘못 정의 된 것일 수 있습니다. 색인이 올바르게 작성되지 않았을 수 있습니다. 테이블과 인덱스 정의를 보지 않고는 말할 수 없습니다. –

답변

2
ALTER TABLE question ADD INDEX (sentiment, company_id); 

SELECT c.id as company_id, c.name, q.sentiment, q.count 
FROM company c 
JOIN (
    SELECT company_id, MAX(sentiment) AS sentiment, COUNT(*) AS count 
    FROM question 
    WHERE sentiment = 0 
    GROUP BY company_id 
    ORDER BY NULL 
) AS q ON c.id = q.company_id 
ORDER BY count DESC LIMIT 5 
+0

와우! 그것은 180 초에서 0.640 초로 떨어졌습니다. 나는 그것을 믿을 수 없습니다. 고마워. – Lomse