쿼리에 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)
인덱스가 모두있는 것이 좋습니다.
고맙습니다. 내부 조인과 카운트 (*)로 갈 것입니다. 내 데이터베이스에 sphinxsearch를 설치하려고 계획 중입니다. 어떻게 생각해? – beck03076
전체 텍스트 검색을 원하면 MySQL과 협력 할 수있는 다양한 제품이 있습니다 : Sphinx, Lucene, Solr. 이 질문을 확인하십시오 : [독립형 전체 텍스트 검색 서버 선택] (http://stackoverflow.com/questions/1284083/choosing-a-stand-alone-full-text-search-server-sphinx-or-solr)) 또는 자신의 연구를하십시오. –
@ beck03076 : 그러나 이것은이 질문에 대한 논쟁의 여지가 없습니다. [DBA 채팅] (http://chat.stackexchange.com/rooms/179)에서 언제든지 질문을 할 수 있습니다 (데이터베이스 용), 너무 막연하여 게시하거나 의견을 구할 수 있습니다./힙) –