2012-07-08 4 views
2

그룹화 : 표는 동일하거나 서로 다른 user_id의 데이터를 포함 할 수 있습니다MySQL의 쿼리 정렬/I는 다음과 같은 필드 테이블 '내용'이 성능

id (an unique, increasing identifier) 
user_id 
content1 
content2 
content3 
... 

합니다. content 필드 중 하나로 정렬 된 데이터를 선택하려고합니다. 그러나 나는 유일한 'user_id'에서 데이터를 선택하고 항상 사용자의 최신 항목을 취하려고합니다 (따라서 가장 높은 id 값). 그룹화가 정렬되기 전에 간단히 group by user_id 수 없습니다.

이것은 내가 지금 뭐하는 거지입니다 :

SELECT * 
FROM `content` 
WHERE `content`.`id` = (
    SELECT `id` 
    FROM `content` as `alt` 
    WHERE `alt`.`user_id` = `content`.`id` 
    ORDER BY `id` DESC 
    LIMIT 1) 
ORDER BY content1 DESC 

그것은 작동하지만 테이블이 커짐에 한 번, 성능이 너무 느린됩니다. 누군가이 쿼리를 개선하는 방법에 대한 조언을 제공 할 수 있습니까? 하위 조회가 content 테이블에 각 행에 대한 실행되기 때문에

+1

테이블의 색인은 무엇입니까? – Fluffeh

+0

이것은 MySQL 매뉴얼에서 설명합니다 : http://dev.mysql.com/doc/refman/5.5/en/example-maximum-column-group-row.html –

답변

3

가 더 많은 데이터와 느린 이유입니다.

이 솔루션은 더 빨리해야 가 같은 테이블에에 가입하는 부속 선택의 결과가 다음입니다 번만 실행됩니다 부속 선택과 같은 - utlizing 인덱스 :

SELECT b.* 
FROM 
(
    SELECT MAX(id) AS maxid 
    FROM content 
    GROUP BY user_id 
) a 
INNER JOIN content b ON a.maxid = b.id 
ORDER BY b.content1 DESC 
+0

빠른 도움을 주셔서 감사합니다. – user1509487

+0

@ user1509487 멋진데! 이 답변을 유용하게 사용 하셨다면 "수락"으로 표시하십시오. 감사! –

0

당신이 필요로 2 단계 접근하지 성능을 위해 1 개의 완전한 SQL.

  1. alt altcontent로부터 임시 테이블을

    임시 테이블 id_Temp을 만들 로 SELECT id 을 만들 수 있습니다. user_id = content. 임시 테이블에서 id

  2. 선택 데이터

    SELECT * contentcontent FROM. id =이

    내 경험에

이 2 단계 접근 방식은 일정한 응답 시간을 콘텐츠 1의 DESC에 의해 ORDER (id DESC 제한 (1)에 의해 id_temp ORDER에서 ID를 선택합니다). 이 방법을 사용하는 웹 페이지는 하루 2 천 5 백만 페이지에 2 개의 Liunx BOX와 함께 사용할 수 있습니다.

관련 문제