2011-10-12 2 views
0

이 쿼리를 최적화하려고하는데, 간단하게 들리지만 속도를 높이는 방법을 찾는 데 어려움을 겪고 있습니다.MySQL Join Table 쿼리 최적화 (HABTM Object Relationship)

"위젯", "카테고리"및 "categories_widgets"테이블 (조인 테이블)이있는 위젯과 카테고리 (HABTM 관계)의 두 객체가 있습니다. 특정 카테고리의 모든 위젯을 찾으려고합니다. 간단한 권리? 일부 카테고리는 10-50k 위젯을 가질 수 있으며 내 검색어는 1-2 초가 걸릴 수 있습니다 (내 사이트는 트래픽이 많으므로 완전히 수용 할 수 없습니다). 여기

내가 지금 뭘하는지입니다 :

SELECT * FROM `categories` 
LEFT JOIN `categories_widgets` ON `categories_widgets`.`category_id`=`categories`.`id` 
JOIN `widgets` ON `widgets`.`id`=`categories_widgets`.`widget_id` 
ORDER BY `widgets`.`id` DESC 
LIMIT 0,10 

내가 아이디 하강하여 위젯을 (이 속도를 죽이는 것입니다) 주문해야합니까, 난 가끔 있는지 확실하지 않습니다 (상당히 높은 오프셋을 가질 수있다 그것에 대해 무엇이든 할 수 있습니다).

테이블 구조 조정에 대한 권장 사항이있는 경우 도움이 될 것입니다. 물론 그럴 가능성도 있습니다 (그러나 많은 범주와 많은 위젯을 쉽게 파쇄 할 수있는 가정).

감사합니다.

답변

0

테이블 레이아웃이 옳았습니다.
이유가 LEFT JOIN입니까? 나는 그것을 JOIN으로 만들었다.
WHERE 절은 어디에 있습니까? "특정 카테고리의 모든 위젯을 찾으십시오."

SELECT * 
    FROM categories_widgets cw 
    JOIN widgets w ON w.id = cw.widgets_id 
WHERE cw.category_id = $my_cat_id 
ORDER BY w.id DESC 
LIMIT 0,10 

그리고 당신은 categories_widgets(category_id)widgets(id)에 인덱스가 어떻게, 맞죠?

+0

색인이 있습니다. 나는 DB (카테고리)에서 몇 가지 추가 정보를 추출하려고했다 ... 나는 방금 그것을 생략하고 정말 전혀 속도에 영향을주지 않았다. 제안 해 주셔서 감사합니다! 다른 건 없니? – Harry