Я разрабатываю программу чтения RSS-каналов, которая использует байесовский фильтр для фильтрации скучных сообщений в блоге.
Таблица Stream предназначена для работы в качестве буфера FIFO, из которого веб-приложение будет потреблять «записи». Я использую его для хранения временных отношений между записями, пользователями и классификациями байесовского фильтра.
После того, как пользователь пометит запись как прочитанную, она будет добавлена в таблицу метаданных (чтобы пользователю не был представлен материал, который он уже прочитал) и удалена из таблицы потоков. Каждые три минуты фоновый процесс будет заново заполнять таблицу Stream новыми записями (т. Е. Всякий раз, когда демон добавляет новые записи после проверки RSS-каналов на наличие обновлений).
Проблема: запрос, который я предложил, является медленным. Что еще более важно, таблица Stream должна содержать только сотню непрочитанных записей одновременно; это уменьшит дублирование, ускорит обработку и даст мне некоторую гибкость при отображении записей.
Запрос (занимает около 9 секунд для 3600 элементов без индексов):
insert into stream (entry_id, user_id)
select entries.id, subscriptions_users.user_id
from entries
inner join subscriptions_users on subscriptions_users.subscription_id = entries.subscription_id
where subscriptions_users.user_id = 1
and entries.id not in (select entry_id
from metadata
where metadata.user_id = 1)
and entries.id not in (select entry_id
from stream where user_id = 1);
Запрос объяснил: вставьте в поток все записи из списка подписок пользователя (subscription_users), которые пользователь не прочитал (т.е. не существует в метаданных) и которые еще не существуют в потоке.
Попытка решения: добавление предела 100 в конец значительно ускоряет запрос, но при повторных выполнениях будет продолжать добавлять другой набор из 100 записей, которых еще нет в таблице (каждый успешный запрос занимает все больше и больше времени) ,
Это близко, но не совсем то, что я хотел сделать.
Есть ли у кого-нибудь совет (nosql?) Или знаете более эффективный способ составления запроса?