2014-11-10 4 views
0

나는 매분마다 증가하는 테이블을 쿼리하는 mysql 작업을하고있다. 또한 쿼리는 제한 절이있는 페이지 매김에도 사용됩니다. 테이블은 상점 웹 사이트에서 사용자 세션을 방문하는 것으로 구성됩니다. store_id, session_id에 대한 인덱스를 이미 추가했습니다. 다음은 쿼리입니다.그룹 별 및 순서를 모두 사용하는 쿼리 최적화

SELECT *, 
    GROUP_CONCAT(email) as email_id 
FROM 
( 
    SELECT * 
    FROM clickstream 
    WHERE clickstream.store_id = '' 
    ORDER BY id DESC 
) as clck 
GROUP BY session_id 
ORDER BY server_now DESC 
LIMIT ".$offset.",".PER_PAGE_PRODUCT_COUNT 

아이디어가 있으십니까?

+0

EXPLAIN을 사용하여 MySQL이 실제로 인덱스를 사용하고 있는지 확인해 보았습니까? –

+2

하위 쿼리에는 용도가없는 것 같습니다. 바깥 쪽의 클릭 스트림 테이블에서 직접 선택할 수 있습니다 (GROUP_CONCAT에 주문 절을 추가 할 수 있음). 하위 쿼리를 사용하면 MySQL이 GROUP BY 절에 대한 인덱스를 사용하지 못하게됩니다. 또한 session_id에 고유 한 server_now가 있습니까? – Kickstart

답변

0

store_id에 대한 색인은이 검색어로 당신을 도울 것입니다. 당신은 다른 색인으로 더 많은 질문을 할 수 없습니다. 서브 쿼리를 제거하면됩니다 :

SELECT 
    *, 
    GROUP_CONCAT(email ORDER BY id) as email_id 
FROM 
    clickstream 
WHERE 
    clickstream.store_id = '' 
GROUP BY 
    session_id 
ORDER BY 
    server_now DESC 
LIMIT 
    $offset,PER_PAGE_PRODUCT_COUNT