次のクエリを最適化しようとしています。私は外部結合がそのトリックを行うと考えていますが、それをまとめる方法について頭を悩ますことはできません.
// ---------------------------------
// Simplified representation of data
// ---------------------------------
create table views (
user_id,
article_id
)
create table article_attributes (
article_id,
article_attribute_id
)
create table articles (
id,
title,
date
)
Views テーブルには数千万のレコードがあります。Articles テーブルには数十万の記事があります。
特定の属性が関連付けられていて、まだユーザーが閲覧していないすべての記事を照合しようとしています。
私が試したことはありますが、うまくスケーリングしません:
select a.title, a.sid as article_id, a.total_views as times_read, a.date
from articles a
join article_attributes att on att.article_id = a.sid
where a.sid not in(
select v.article_id
from views v
join article_attributes att on att.article_id = v.article_id
where user_id = 132385
and att.article_attribute_id = 10
group by v.article_id
)
and att.article_attribute_id = 10
and a.date >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 day)
order by total_views desc
limit 5
これは問題なく動作しますが、ユーザーが閲覧した記事が増えるほど速度が大幅に低下します。アイデアや提案をいただければ幸いです。