2013-01-17 8 views
0

이것은 제품 테이블의 구조입니다.
현재 1 백만 개의 레코드가 있습니다. 쿼리 그룹을 &로 주문하면 성능 문제가 있습니다. enter image description here쿼리 별 순서대로 그룹화

enter image description here

검색어 :

SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2 

얼마나 빠르게 수행하려면이 쿼리를 개선하기 위해? store_id를 인덱싱했습니다. ID는 기본 키입니다.

select p.* 
from product p join 
     (select store_id, max(id) as maxid 
     from product p 
     group by store_id 
    ) psum 
     on psum.store_id = p.store_id and p.id = maxid 

당신은 테이블의 날짜가없는, 그래서 나는 가장 큰 ID가 가장 최근의 있으리라 믿고있어 :

+1

어떤 색인이 테이블에 있습니까? – OldProgrammer

+0

id - PRIMARY (인덱스 이름), store_id - store_id (인덱스 이름) –

+1

이 쿼리가 수행하려고하는 것을 설명 할 수 있습니까? "상점에서 ID의 역순으로 두 개의 임의의 제품 이름을 선택하는 것"이 ​​특히 유용하지는 않습니다. –

답변

0

은이 같은 쿼리를 원하는.

+0

안녕하세요, 2 레코드 만 필요합니다. –

+0

하위 쿼리에서'store_id'를 출력 할 필요가 없기 때문에'maxid'를 조인해야합니다. – newtover

+0

@newtover. . . 조인 문제를 찾아 주셔서 감사합니다. 이 쿼리는 주석을 기반으로합니다. 원래 쿼리는 나에게별로 의미가 없습니다. –

0
SELECT x.* 
    FROM my_table x 
    JOIN (SELECT store_id, MAX(id) max_id FROM my_table GROUP BY store_id) y 
    ON y.store_id = x.store_id 
    AND y.max_id = x.id 
ORDER 
    BY store_id DESC LIMIT 2; 
+0

은 'id'가 기본 키이므로 'max_id'에 가입하는 것으로 충분합니다. – newtover

0

해키 (하지만 빠른) 솔루션 :이 작동 방법

SELECT product_name 
FROM (
    SELECT id 
    FROM vs_product 
    GROUP BY store_id DESC 
    LIMIT 2) as ids 
JOIN vs_product USING (id); 

: 오름차순으로 STORE_ID 저장 (STORE_ID, ID) 쌍에

귀하의 인덱스입니다. GROUP BY DESC은 MySQL이 역순으로 인덱스를 읽도록합니다. 서브 쿼리는 각 store_id에 대해 최대 ID를 가져옵니다. 그런 다음 전체 테이블에 다시 결합하여 제품 이름을 가져옵니다.

쿼리는 최대 값을 갖는 저장소 ID에 대해 두 개의 제품 이름을 가져옵니다.