2012-06-17 6 views
1

저는 기사 테이블, 저자 테이블 및 저자를 저자와 매핑하는 테이블을 가지고 있습니다.MySQL에서 GROUP BY 유형의 쿼리를 빠르게하는 가장 빠른 방법은 무엇입니까?

나는 대부분의 기사와 저자를 찾아 다음 쿼리를하고 있어요 :

SELECT a.*, count(*) c 
FROM articleAuthors aa 
LEFT JOIN authors a ON aa.author_id=a.id 
GROUP BY (author_name) 
ORDER BY c DESC LIMIT 50 

그러나이 쿼리를 완료하는 데 전체 분 정도 걸립니다. 데이터베이스에는 articles_to_authors 테이블에 약 1,000,000 개의 레코드가 있습니다.

어떻게이 GROUP BY 쿼리의 속도를 높일 수 있습니까?

+1

이 테이블의 색인은 무엇이며, 조회에 대한 Explain 출력을 게시 할 수 있습니까? – Ben

+0

빠른 질문 ... articleAuthors 테이블에 50 명이 넘는 저자가 있습니까? – DRapp

+0

@Ben -'authors' 테이블'author_name'에 풀 텍스트 인덱스가 있고'id'에 프라이 머리 키 인덱스가 있습니다. 'articleAuthors' 테이블에서'article_id'의 키 인덱스 인'author_id'와'id'의 프라이 머리 키 인덱스에 대한 키 인덱스를 가지고 있습니다. 나는 설명 출력을 순간적으로 게시 할 것이다. – bodacydo

답변

3

저자가 50 명이 넘는 articleAuthors 테이블을 가정 할 때 원하는 구성 요소를 미리 쿼리하여 원하는 50 개의 레코드로 제한합니다. (author_id)에 색인이 있는지 확인하십시오. 또한 authors 테이블에 (id)에 대한 색인이 있는지 확인하십시오. prequery에 내려 계수에 의해

select 
     a.*, 
     JustAuthorIDs.cntPerAuthor 
    from 
     (select 
       aa.author_id, 
       count(*) cntPerAuthor 
      from 
       articleAuthors aa 
      group by 
       aa.author_id 
      order by 
       cntPerAuthor DESC 
      limit 50) JustAuthorIDs 
     JOIN Authors a 
     on JustAuthorIDs.author_ID = a.id 

순서로 조회를 변경은 사전 플러시 먼저 가장 큰 수에 의해 사전에 주문하고 50 개 기록 후 정지됩니다. 그런 다음 authors 테이블에 간단한 조인을하여 이름과 다른 것을 가져옵니다.

"bill board"라는 저자가있는 경우 이름 대신 author_ID를 기준으로 그룹을 만들었습니다 ... 실제 ID는 둘 사이에서 구분됩니다.

위의 쿼리를 사용하면 항상 모든 백만 건의 레코드를 쿼리해야합니다. 이런 식으로 authors 테이블에 하나의 "AuthoredItems"열을 추가하는 것이 좋습니다. 그런 다음 authorArticles 테이블의 트리거를 통해 항목이 추가되거나 삭제되면 작성자 테이블에서 한 명의 작성자에 대한 최종 개수를 업데이트하면됩니다. 그런 다음 "AuthoredItems"열에 색인을 만듭니다. 그런 다음 수행을 통해 수퍼 유저가 간단하게 처리 할 수 ​​있습니다.

select a.* 
    from authors a 
    order by a.AuthoredItems 
    limit 50 
+0

이것은 @Drapp을 완전히 작동합니다! 정말 고마워. 이것은 또한 매우 빠릅니다 -이 쿼리는 약 1 초가 걸렸습니다! 나는 author_id로 그룹화하는 것을 생각하지 않았습니다. 내 잘못이야. 원래 쿼리를 다시 실행하고 author_id로 그룹화하면 속도가 느려지는지 확인합니다. – bodacydo

+0

좋은 업데이트 @Drapp. 나는 트리거에 익숙하지 않다. (나는 MySQL에 그것들이 있다는 것을 몰랐다.) 트리거를 만드는 방법을 살펴 보겠습니다. 정말 좋은 방법입니다. :) – bodacydo

+0

@bodacydo, 도와 줘서 기쁩니다 ... 아무도 다른 질문이 아직 열려 있다고 생각하지 않도록 "체크 표시"하는 것을 잊지 마세요 :) – DRapp

관련 문제