2013-07-27 3 views
0

나는 이것이 펄프에 맞았다는 것을 알고있다 - 그러나 나는 작동하는 정말 좋은 대답을 보지 못했다. 여기 내 상황은 : 나는 다음과 같은 인덱스를 시도했습니다다른 쿼리 그룹 by MySQL 쿼리

SELECT items.item_name, sort_order as total_count, user_top_favorites.item_id.item_id 
     FROM user_top_favorites 
     INNER JOIN items ON user_top_favorites.item_id = items.item_id 
     WHERE user_top_favorites.user_id = 1 
     GROUP by user_top_favorites.item_id.item_id 
     ORDER BY sort_order asc 
     LIMIT 0 , 6 

:

user_sort (user_id, item_id, sort_order) 
user_sort (item_id, user_id, sort_order) 
user_sort (user_id, sort_order, item_id) 

그리고 난 항상 얻을 : Using temporary; Using filesort

올바른 인덱스가 여기에 내가 다음 쿼리를 임시 파일과 filesort를 피 하시겠습니까?

UPDATE : user_sort 내가 만든 인덱스의 이름 만이며, 인덱스하여 user_top_favorites 표에 속한다.

+1

제한을 적용하고 그룹화하기 전에 쿼리가 생성하는 행 수는 얼마입니까? – Joni

+3

집계 된 함수가 없는데 왜 그룹을 사용합니까? – Uriil

+1

'user_sort'의 인덱스가 그 테이블을 사용하지 않는 쿼리에 영향을주는 이유는 무엇입니까? –

답변

0

난 당신이 item_iduser_id, sort_orderitems (에 (user_top_favorites에 중복이없는 경우. 당신은 또한 join 전에 상단 (6)의 선택을 할 수있다)에 group by을 제거 할 수 있다고 생각합니다.이 테이블을 구체화 있지만 어떤 성능 저하가 없다는 것을 너무 작아서

SELECT i.item_name, utf.sort_order as total_count, utf.item_id.item_id 
    FROM (select utf.* 
      from user_top_favorites utf 
      where utf.user_id = 1 
      order by utf.sort_order 
      limit 6 
     ) utf join 
     items i 
     ON utf.item_id = i.item_id 
    ORDER BY utf.sort_order asc; 

이 쿼리는 당신이 필요, 다음 인덱스가 성능에 도움이 될 것입니다 경우.. user_top_favorites(user_id, sort_order)items(item_id)

당신이 t를 원하는 경우 약간 위험하다면, 외부를 제거 할 수있다 order by. MySQL은 서브 쿼리의 순서를 보장하지 않지만 실제로 원하는 순서대로 얻을 수 있다고 생각합니다. 그러나 6 개의 레코드를 정렬하는 데는 실제로 약간의 시간이 걸립니다.