2014-06-24 10 views
0

그룹별로 주문할 때 현재 매우 느린 쿼리가 발생합니다.주문순으로 mysql 그룹을 최적화하는 방법

SELECT * FROM foo GROUP BY bar_id ORDER BY created_at DESC 
: 질의 기에서 순서

sqlFiddle

푸 테이블 구조 여기

id -> pk (indexed) 
bar_id -> foreign key (indexed) 
data -> varchar 
created_at -> timestamp (indexed) 

하여 다음 별도의 열 때문에 I의 인덱스를 사용하고 있지 않은지 경사를 가지고있다

기본적으로 각 bar_id에 대한 최신 레코드를 가져 오려고합니다. 그러나이 작업을 완료하는 데 최대 11 초가 소요됩니다. 이 유형의 쿼리를 수행하는 더 좋은 방법이 있습니까?

+2

* 더 좋은 방법? 이것은 심지어 길 *이 아닙니다! – Strawberry

+3

@Matt @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 서버는 각 그룹에서 자유롭게 값을 선택할 수 있습니다. mysql.com/doc/refman/5.6/en/group-by-extensions.html) – VMai

+0

@VMai 이렇게하려면 새로운 쿼리를 사용할 수 있습니까? – Matt

답변

2
SELECT COUNT(*) FROM foo; 
+----------+ 
| COUNT(*) | 
+----------+ 
| 98304 | 
+----------+ 
1 row in set (0.03 sec) 

SELECT x.* 
    FROM foo x 
    JOIN 
    (SELECT bar_id 
      , MAX(created_at) max_created_at 
     FROM foo 
     GROUP 
      BY bar_id 
    ) y 
    ON y.bar_id = x.bar_id 
    AND y.max_created_at = x.created_at; 

531 rows in set (0.01 sec) 

참고 : 스키마를 약간 수정했습니다. http://sqlfiddle.com/#!2/a6296/2

+0

IN (select max (created_at) from foo)을 사용하지 않는 이유는 무엇입니까? –

+0

@ JohnRuddell 1. 성능이 적절하게 문제가되기 때문에. 그리고 2. 하나의 bar_id의 max (created_at) 값이 다른 bar_id의 max (created_at)가 아닌 값에 해당하면 어떻게 될까요? – Strawberry

+0

나는 그것에 대해 이미 생각해 봤지만 ... OP가 그의 데이트가 (그의 예상 된 결과에서) 똑같다고 말하는 것이 더 간단 할 것 같다. 심지어 최대 날짜와 같은 사용자 정의 변수를 사용한다. –

관련 문제