2014-01-25 5 views
0

내가 레일 응용 프로그램에 대한 MySQL의에서 세 개의 테이블이 있습니다성능 저하

  • 이야기 (ID, 제목, 요약, 괴로움) =>있다 217754 개 기록
  • 태그 (ID를, 명) =가> 25,123 레코드
  • taggings (story_id, tag_id) => 갖고 갖는다 800,751

이 레일에서 로그이다

스토리로드 (143 00.8ms)

SELECT `stories`.* 
FROM `stories` INNER JOIN 
    `taggings` 
    ON `taggings`.`story_id` = `stories`.`id` INNER JOIN 
    `tags` ON `tags`.`id` = `taggings`.`tag_id` 
WHERE (tags.id = 3141) 
ORDER BY hotness 
LIMIT 26 OFFSET 0 

14 초 이상 걸립니다. 이야기, 태그 및 태그가있는 모든 색인이 괜찮을 것이라고 확신합니다. 내가 말하는 또 다른 점은 항상 뜨거움이 변하고 있다는 것입니다.

이것은 MySql의 확장성에 관한 것입니까?

PS : 당신이 tags 테이블에서 아무것도 사용하지 않기 때문에 설명 결과 =>https://gist.github.com/iCEAGE/8622705

+0

해당 쿼리에 대한 EXPLAIN 출력은 무엇입니까? 쿼리에 SELECT 횟수 (*)를 사용하면 합리적인 결과를 얻을 수 있습니까? – scraatz

+0

이것은 MySQL의 확장성에 관한 것이 아닙니다. 이는 색인이 잘못되었거나 특정 태그와 일치하는 데이터의 * 로트 *에 관한 것입니다. 테이블에있는 색인을 게시하십시오. –

+0

@scraatz EXPLAIN 출력이 PS에 추가되었습니다. SELECT count (*)는 합리적인 결과를 가졌습니다. 약 0.3 초입니다. –

답변

0

당신은 당신의 쿼리를 단순화 할 수 있습니다 도움이되지 않습니다이 경우

SELECT s.* 
FROM `stories` s INNER JOIN 
    `taggings` t 
    ON t.`story_id` = s 
WHERE t.id = 3141 
ORDER BY s.hotness 
LIMIT 26 OFFSET 0; 

이 얼마나 큰 ?

SELECT count(*) 
FROM `stories` s INNER JOIN 
    `taggings` t 
    ON t.`story_id` = s 
WHERE t.id = 3141;