2012-02-23 5 views
1

이 질문은 항목 (예 : 뉴스 기사)을 포함하는 모든 종류의 시스템과 이러한 항목을 보는 사용자에게 적용됩니다.(mysql)

사용자 테이블이 이고 기사 테이블이 ([id],[title],[text])이고 모든 사용자가 보는 모든 기사가 포함 된 테이블이 있다고 가정 해 봅시다. ([user_id],[article_id]).

내가하고 싶은 일은 이전에 읽지 않은 기사 만 효율적으로 사용자에게 보여줍니다. 현재 사용자가 이미 1M 기사를 읽으면

는 난 그냥

select id,title,text from articles where id not in (select article_id 
from article_views where user_id = 123) 

그러나 같은 일을 할 수있어? 쿼리는 다음과 같을 것입니다.

select id,... from articles where id not in (1,2,3,......1000000) 

이렇게 생각하면 실용적이지는 않습니다.

또한, 사용자가 읽고 더 많은 기사 때문에 짜증 - 그가 것 느린 응답 시간 새로운 읽지 않은 기사를 검색하는 ..

다른 제안, DB-지혜를?

+0

검색어가 너무 느리지 않습니다. 적절한 인덱스를 가정하면 데이터베이스는이를 조인으로 다시 작성합니다. @ Yuck은 올바른 답변을 가지고 있었지만 어떤 이유로 든 삭제했습니다. –

답변

1

때때로 LEFT JOIN을 수행하고 NULL 만 반환하는 (예 : 찾을 수 없음) 항목은 하위 선택보다 빠를 수 있습니다. 그것은 직접 조인 않습니다이다 : B를 만 나는 (I 어쨌든 그 테이블에 기본 키가 될 것이라고 생각)에 대한 인덱스 (사용자 ID, article_id를)을 보장 할

select 
     a.id, 
     a.title, 
     a.text 
    from 
     articles a 
     LEFT JOIN article_views av 
      on av.User_ID = 123 
      AND a.id = av.article_id 
    where 
     av.article_id IS NULL 

일치하는 항목이없는 경우들을 포함한다.

1

대신 문에 직접 추가, 당신은 같은 것을 실행할 수 있습니다 :

select articles.id, ... from articles, article_views where article_views.user_id = [useridhere] and articles.id != article_views.id 

그것은 큰 쿼리를 갖는 문제를 완화,하지만 당신 만이 있다면 당신은 여전히 ​​만 기사를 비교하는 조항.

+0

답변 주셔서 감사합니다,하지만 효율성 문제를 해결하지 못했기 때문에 나는 당신의 대답을 받아 들일 수 없습니다. – programmer