2012-08-07 1 views
0

나는 나의 MySQL 데이터베이스에 위의 모델을 가지고 :괜찮은 성능으로 일대 다 연관 날짜별로 주문하는 방법은 무엇입니까?

Blogs (id: integer, name: varchar) 
Posts (id: integer, name: varchar, blog_id: integer, created_at: date) 

내가 newests의 게시물이 사람에 의해 주문 된 모든 블로그의 목록을 검색 할 수 있습니다.

SELECT b.*, (SELECT p.created_at FROM posts p WHERE p.blog_id = b.id ORDER BY p.created_at DESC LIMIT 1) AS last_post_created_at FROM blogs b ORDER BY last_post_created_at DESC; 

는 그러나이 쿼리가 너무 느리고 내 응용 프로그램에서 사용할 수 없어요 :

나는 다음과 같은 쿼리 것을 도달했습니다.

너희들은 그 좋은 해결책이 있니?

감사합니다.

+0

'블로그'테이블의 행 수는 몇 개인 지? –

+0

이 쿼리의'Posts' 테이블에'(blog_id, created_at)'인덱스를 추가하십시오. –

+0

@ypercube 약 10k 및 게시물 약 100k – robertokl

답변

2

쿼리의 재 작성 :

SELECT b.*, 
     p.last_post_created_at 
FROM blogs b 
    LEFT JOIN 
    (SELECT blog_id, 
      MAX(created_at) AS last_post_created_at 
     FROM posts 
     GROUP BY blog_id 
    ) AS p 
    ON p.blog_id = b.id 
ORDER BY last_post_created_at DESC; 

(blog_id, created_at)에 인덱스가 모두 이것과 버전을 도움이 될 것입니다. 당신이 반환 된 블로그의 수를 제한하려면

, 당신은 하위 쿼리에서 ORDER BY을 추가하고 LIMIT 거기에 넣어해야합니다

SELECT b.*, 
     p.last_post_created_at 
FROM blogs b 
    LEFT JOIN 
    (SELECT blog_id, 
      MAX(created_at) AS last_post_created_at 
     FROM posts 
     GROUP BY blog_id 
     ORDER BY last_post_created_at DESC 
     LIMIT 100 
    ) AS p 
    ON p.blog_id = b.id 
ORDER BY last_post_created_at DESC; 
0

사용하십시오 view. 좋은 점을 알고 사용하십시오!

+0

보기가 성능 문제에 도움이됩니까? 동일한 쿼리를 수행하면 쿼리와 동일한 시간이 걸립니다. – robertokl

+0

그와는 반대로 -보기가 사용자의 쿼리에 대한 데이터를 실시간으로 준비합니다. 쿼리 정의를 기반으로하는 가상 테이블입니다. – FloydThreepwood

관련 문제