MySQL을 읽고, 이해하고 최적화하는 방법을 이해하는 데 여전히 문제가 있습니다. orderby 컬럼에 인덱스를 생성하는 것을 알고 있지만 그게 그 것이다. 따라서 나는 당신이 조정이 쿼리를 나를 도울 수 바라고 :조인을 사용하여 MySQL 쿼리를 최적화하는 데 도움이 필요합니다.
이EXPLAIN
SELECT specie.id, specie.commonname, specie.block_description, maximage.title,
maximage.karma, imagefile.file_name, imagefile.width, imagefile.height,
imagefile.transferred
FROM specie
INNER JOIN specie_map ON specie_map.specie_id = specie.id
INNER JOIN (
SELECT *
FROM image
ORDER BY karma DESC
) AS maximage ON specie_map.image_id = maximage.id
INNER JOIN imagefile ON imagefile.image_id = maximage.id
AND imagefile.type = 'small'
GROUP BY specie.commonname
ORDER BY commonname ASC
LIMIT 0 , 24
어떤이 쿼리가하는 것은 정화를위한 가장 카르마와 사진을 찾을 수 있습니다. 여러 이미지 파일 (형식) 당이 있기 때문에 나는 종의 테이블, 이미지의 테이블 사이의 매핑 테이블과 imagefile 테이블이
http://www.jungledragon.com/species
:이 라이브의 결과를 볼 수 있습니다 영상.
출력 설명 : 정화 테이블
, 나는 그것의 기본 ID와 필드으로 commonname에 인덱스가 있습니다. 이미지 테이블의 경우 이드와 카르마 필드에 인덱스가 있고이 질문과 관련이없는 몇 가지 인덱스가 있습니다.
이 쿼리는 현재 0.8에서 1.1 초가 걸리고 내 생각에는 너무 느립니다. 나는 적당한 색인이 이것을 여러번 가속화 할 것이라는 의혹을 가지고있다. 그러나 나는 어느 것을 모른다.
당신이 종 당 1 항목을 찾고 계십니까 : 당신은
INNER JOIN image
와 하위 쿼리를 대체하고 최종ORDER BY
절에ORDER BY karma DESC
이동하여 동일한 결과를 얻을 수 있을까? 그리고 그것은 최대 카르마 값을 가진 사람이 될 것입니까? 종, 카르마에 대한 색인으로 시작 하겠지만 종에 대한 참조는 이미지 파일에 표시되지 않습니다. – DRapp'JOIN'과 관련된 모든 컬럼에 인덱스를 넣으십시오. 내가 본 바로는'specie_map.specie_id'와'imagefile.image_id'에'INDEX'을 넣으면 속도가 올라갈 것입니다. –
@Drapp : 종의리스트와 관련이 있습니다. 각 종에 대해 가장 좋은 이미지가 선택됩니다. – Ferdy