2009-06-11 3 views
0

(MySQL의) :일반 SQL 모델 최적화 질문 내가 DB 모델의 이런 종류의 최적화 할 수있는 가장 좋은 방법이 있는지 알 필요가

[category] 
idCategory 
name 

[postCategory] (a post can be in more than 1 category) 
idCategory 
idPost 

[post] 
idPost 
post 

[comment] 
idComment 
idPost 
inputDate 
comment 

내가해야 할거야 : 여기

내 테이블입니다 특정 시간 범위 내에서 특정 범주의 모든 게시물을 표시합니다 (시간은 "comments"에서입니다). 시간 범위는 고정되어 있습니다 (1 일, 1 주, 1 개월, 1 년). (인덱스를 사용 외에)이 최적화 할 수있는 방법이 있나요 ...

SELECT DISTINCT(post.idPost), post.post 
from post 
INNER JOIN comment ON post.idPost = comment.idPost 
INNER JOIN postCategory ON postCategory.idPost = post.idPost 
WHERE postCategory.idCategory = <myCategoryId> 
    AND comment.inputDate >= <today - time range> 

하자

내가 10K 게시물과 50 만 코멘트를 지원하기 위해, 소원 말 : 는 여기에 내가와 함께 무엇입니까? 저장 프로 시저, 임시 테이블이있는 쿼리를 사용하고 "precalculated"필드를 어딘가에 추가 하시겠습니까?

고마워요! :)

+0

FWIW, DISTINCT (post.idPost)를 사용하면 DISTINCT가 하나의 열에 만 적용된다는 일반적인 오해를 나타냅니다. 이것은 잘못된 것입니다. 괄호를 사용하든 아니든간에 선택 목록에 의해 반환 된 전체 튜플에 항상 적용됩니다. 이것은 귀하의 질문과 관련이 없으며 단지 참고 용입니다. –

답변

0

데이터베이스에 연결하기 전에 클라이언트 측의 <today - time range> 부분을 계산할 것입니다.

너머에있는 인덱스, 서버로드 (메모리에 캐시 된 내용) 및 각 테이블의 데이터 크기 (일반적인 게시물 당 얼마나 많은 댓글, 게시물 수 카테고리 별). 즉 프로필이 필요합니다. 모든 것을 논리적으로 가정하면 (그렇지 않습니다!) 알맞은 쿼리 최적화 프로그램은 다른 것을 처리 할 수 ​​있어야합니다.

내가 습관을 다르게 다룰 수있는 몇 가지 사항이 있지만,이 경우 시스템을 더 모르게하지 않아도됩니다. 주요한 것 I 'd는 내가 양에 관해 생각할 것이다라는 것이다.

일반적으로 조인을 순서대로 수행하면 가능한 한 오랫동안 결과 집합이 작게 유지되도록 쿼리를 표현하고 싶습니다. 이 경우 postCategorycomments 조인 위에 조인하고 "= <MyCategoryID>"조 건을 조인 식의 일부로 위로 이동하는 것일 수 있습니다.

+0

Mmm ok .. 자동 스크립트 등으로 더미 데이터를 삽입하여 모델을 시험해 보는 것이 좋은 생각입니까? 또는 어쨌든 실제 데이터와 다른 결과를 얻을 수 있습니까? – mrmuggles

+0

더미 데이터는 데이터가없는 것보다 낫습니다. 특히 실제 데이터를 다소 대표한다고 확신 할 수있는 경우에 특히 그렇습니다. –

+0

나는 그런 식으로 해보고 문제가 있으면 도움을 청할 것이다. 감사! – mrmuggles