1

나는이 다음 표,MySQL의 파생 테이블, 성능,

  1. link_books_genres, * 테이블 구조 -> book_id, genre_id *
  2. 장르, * 테이블 구조 -> genre_id, GENRE_NAME *

이 book_ids의 집합을 감안할 때, 나는 다음과 같은 결과를 형성 할

나는이 쿼리를 작성

,

SELECT one.genre_id, 
     one.genre_name, 
     two.count 
FROM genres as one,(SELECT genre_id, 
        count(book_id) as count 
        FROM link_f2_books_lists GROUP BY genre_id) as two 
WHERE one.genre_id = two.genre_id; 

그 최선의 해결책인지 모르겠어요,하지만이 가능하면 최적화 또는 잘 형성되어있는 경우, 검증하고자합니다.

P. 그것은 레일에 루비로 끝났기 때문에 모든 레일 지향 접근법도 좋을 것입니다.

답변

2

쿼리에 SQL-92 JOIN 구문이 사용되지 않고 이전 암시 적 조인 구문이 사용됩니다. 시간 (20 년)이 지나면 사용을 시작해야합니다.

별칭에 COUNT과 같은 키워드를 사용하는 것도 좋지 않습니다. 대신 cnt 또는 book_count을 사용할 수

SELECT one.genre_id, 
     one.genre_name, 
     two.cnt 
FROM 
     genres AS one 
    INNER JOIN 
     (SELECT genre_id, 
       COUNT(book_id) AS cnt 
     FROM link_f2_books_lists 
     GROUP BY genre_id 
     ) AS two 
      ON one.genre_id = two.genre_id ; 

MySQL은 일반적으로 조금 더 빠른 COUNT(*) 함께 작은 성능 개선 될 것 COUNT(book_id)COUNT(*)에 변경, NULL 수 없습니다 book_id 그래서 만약.


오프 물론 당신은이 파생 테이블없이 가입 다시 작성할 수 있습니다 : 두 버전의

SELECT one.genre_id, 
     one.genre_name, 
     COUNT(*) AS cnt 
FROM 
     genres AS one 
    INNER JOIN 
     link_f2_books_lists AS two 
      ON one.genre_id = two.genre_id 
GROUP BY one.genre_id ; 

, 당신은 어떤 책없이 주문 장르 (0 카운트) LEFT OUTER JOIN-INNER JOIN을 변경할 수 있습니다 표시 할 수 있습니다. 그러나 올바른 결과를 얻으려면 COUNT(*)이 아닌 COUNT(two.book_id)을 사용하십시오. 그 장르를 (즉, 필요한 변화는 매우 간단합니다. 당신의 WHERE 버전이을 시도해보십시오 JOIN 구문을 사용하는 하나의 좋은 이유!) 포함되지 않습니다

위의 버전 (그리고 당신)


LEFT JOIN 버전도 같이 쓸 수 있습니다 : 성능에 관한

SELECT one.genre_id, 
     one.genre_name, 
     (SELECT COUNT(*) 
     FROM link_f2_books_lists AS two 
     WHERE one.genre_id = two.genre_id 
     ) AS cnt 
FROM 
     genres AS one ; 

, 아무것도 테스트 Y보다 더 나은 없다 나 자신. 그것은 모두 당신이 사용하는 MySQL의 버전에 달려 있습니다. (새로운 버전은 실행 계획을 만들기 위해 더 많은 옵션을 선택할 수있는 더 나은 옵티마 이저를 가질 것이고, 아마도 다른 버전을 동등한 것으로 식별 할 것입니다.) 테이블의 크기, 가지고있는 인덱스, 데이터의 분포 (얼마나 많은 장르? 장르별 평균 장서 수는 얼마나 되는가?등), 메모리 (및 기타 MySQL) 설정 및 아마 내가 잊어 버린 다른 많은 요소가있을 수 있습니다.

대부분의 경우 모든 버전에서 (genre_id, book_id)의 색인이 유용 할 것입니다.

일반적으로 다차원 테이블에는 (genre_id, book_id)(book_id, genre_id) 인덱스가 모두있는 것이 좋습니다.

+0

고맙습니다. 내부 조인과 카운트 (*)로 갈 것입니다. 내 데이터베이스에 sphinxsearch를 설치하려고 계획 중입니다. 어떻게 생각해? – beck03076

+0

전체 텍스트 검색을 원하면 MySQL과 협력 할 수있는 다양한 제품이 있습니다 : Sphinx, Lucene, Solr. 이 질문을 확인하십시오 : [독립형 전체 텍스트 검색 서버 선택] (http://stackoverflow.com/questions/1284083/choosing-a-stand-alone-full-text-search-server-sphinx-or-solr)) 또는 자신의 연구를하십시오. –

+1

@ beck03076 : 그러나 이것은이 질문에 대한 논쟁의 여지가 없습니다. [DBA 채팅] (http://chat.stackexchange.com/rooms/179)에서 언제든지 질문을 할 수 있습니다 (데이터베이스 용), 너무 막연하여 게시하거나 의견을 구할 수 있습니다./힙) –

0
SELECT one.genre_id, one.genre_name, count(two.book_id) 
FROM genres as one, link_books_genres as two 
WHERE one.genre_id=two.genre_id 
GROUP BY genre_id