2012-04-16 3 views
3

이 쿼리를 더 빠르게 만들 수 있는지 궁금하신가요? 또는 더 잘 작동하는 다른 유사한 쿼리가 있다면? 를 사용하지 않고이 SQL 쿼리를 더 빠르게 만들 수 있습니까?

SELECT id,source FROM posts 
WHERE id = ANY(SELECT image_id FROM `post_tags` WHERE tag_id = (SELECT id FROM `tags` WHERE tag = _utf8 '$TAG' collate utf8_bin)) 
    AND posts.exists = 'n' 
ORDER BY posts.ratecount DESC 
LIMIT 0,100 

는 :

AND posts.exists = 'n' 
ORDER BY posts.ratecount 
DESC LIMIT 0,100 

이 가능한 수준으로 쿼리 속도,하지만 다소 내가 뭘하는지이 필요합니다.

  • 태그 테이블에는 '태그'와 'ID'에 대한 고유 색인이 있습니다.
  • 태그에는 83K 개의 행이 있습니다.
  • Post_tags에는 'image_id', 'tag_id'에 대한 고유 색인이 있습니다. 또한 각각에 대한 정상적인 색인.
  • Post_tags에는 471K 개의 행이 있습니다.
  • 게시물에는 'id'에 대한 고유 색인이 있습니다. 또한 '존재'와 '비율 계산'에 대한 일반 색인입니다.
  • 게시물 테이블에는 약 1.1M 개의 행이 있습니다.
+0

색인이 무엇입니까? – dfb

+0

테이블 게시물 및 post_tags에있는 데이터의 양은 어느 정도입니까? 필요한 모든 지표를 설정 했습니까? – Tobi

+3

쿼리 플랜에 무엇이 표시됩니까? 색인이 실제로 사용됩니까? 정상적인 조인으로 다시 작성하면 효과가 있습니까? (때로는 기획자가 움직이지 않을 수도 있습니다.) 테이블 통계가 업데이트 되었습니까? 어쨌든 모든 정보를 원래 게시물에 넣으십시오. DBA에서 시도해보십시오. 투표가 "너무 현지화 된"것으로 마감했습니다. –

답변

0

누군가가 제안한대로 JOIN을 사용하여 작동하도록 관리했습니다.

SELECT * FROM posts 
LEFT JOIN post_tags ON post_tags.image_id = posts.id 
JOIN tags ON post_tags.tag_id = tags.id 
WHERE tags.tag = _utf8 '$tag' collate utf8_bin 
    AND posts.exists = 'n' 
ORDER BY posts.ratecount DESC 
LIMIT 0,100 

22s> 0.26s에서 취한 단축 시간.

0

태그 표는 어떤 모양입니까? 그것은 ID와 TAG 필드만을 포함합니까? TAG(TAG, ID)에 고유 색인을 작성하여 대부분의 조회가 색인 만 검색합니다.

POST_TAGS 테이블은 어떻습니까? TAG_ID와 IMAGE_ID의 조합일까요? 다시 말하지만, POST_TAGS(IMAGE_ID, TAG_ID)에 고유 색인을 작성합니다.

인덱스의 필드 순서가 중요하며 POST_TAGS(TAG_ID, IMAGE_ID)의 인덱스는 구문 분석 계획에서 사용하는 POST_TAGS(IMAGE_ID, TAG_ID)의 인덱스와 많이 다릅니다.

POSTS(ID, POSTS, RATEACCOUNT)의 고유 색인을 갖는 POSTS 테이블에서 (중복 색인이므로 INSERT, UPDATE 및 DELETE에 대한 추가 비용이 발생하지만이 쿼리에서 도움이됩니다).

그런데 내부 쿼리에서 JOIN을 사용하면 성능을 향상시킬 수 있습니다.

+0

태그 테이블은 id/tag/tagcount를 포함합니다. POST_TAGS (IMAGE_ID, TAG_ID)에 대한 고유 색인이 이미 있습니다. –

관련 문제