감사합니다.쿼리에서 GROUP BY를 사용할 때 MySQL 테이블 인덱싱에 대한 도움말
표 저자
id INT
nickname VARCHAR(50)
status ENUM('active', 'blocked')
about TEXT
표 책
author_id INT
title VARCHAR(150)
나는 각 저자를 얻기 위해,이 테이블에 대해 쿼리를 실행 해요 :
두 InnoDB 테이블이 있습니다 그가 가지고있는 책의 수 :
SELECT a. * , COUNT(b.id) AS book_count
FROM authors AS a, books AS b
WHERE a.status != 'blocked'
AND b.author_id = a.id
GROUP BY a.id
ORDER BY a.nickname
이 쿼리는 매우 느립니다 (실행하는 데 약 6 초 걸림). 난 books.author_id
에 대한 색인을 가지고 완벽하게 작동하지만,이 쿼리는 그것을 사용할 수 있도록 authors
테이블에 색인을 만드는 방법을 모르겠다. 여기
는 모습을 EXPLAIN 방법 전류 :
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ALL PRIMARY,id_status_nickname NULL NULL NULL 3305 Using where; Using temporary; Using filesort
1 SIMPLE b ref key_author_id key_author_id 5 a.id 2 Using where; Using index
내가 MySQL manual on optimizing queries with group by을 검토 한 결과,하지만 난 내 쿼리를 적용 할 수있는 방법을 알아낼 수 없었다.
나는 이것에 대한 도움과 힌트를 주셔서 감사합니다. MySQL이 사용할 수 있도록 인덱스 구조 여야합니다.
편집은
나는 시도했다 :
(id, status, nickname)
(status, nickname)
두
이 같은 상황의 결과.
색인 생성을위한 기본 규칙은 조인 및/또는 where 절에서 사용하는 모든 필드를 색인화해야한다는 것입니다. 귀하의 질의에 대해, 그것은 a.id, b.author_id 및 a를 의미합니다.상태를 모두 색인화해야합니다. –