SQL: Как найти похожие блоги по подписчикам - PullRequest
0 голосов
/ 30 апреля 2020

Для сайта микроблогов, где создание блога очень просто, поэтому я работаю с + 100k Блогов в качестве возможного сценария.

Я хочу показать в каждом блоге связанные блоги, мой первый Идея состоит в том, чтобы использовать последователей, потому что я думаю, что это лучшие данные, которые я должен сделать. Я открыт для любой идеи, но я продолжу объяснять, что я пытаюсь сделать.

Я планирую позже обработать выбранные данные, чтобы сделать отношения, но для простоты я сосредоточусь на первый запрос:
Выберите, какие блоги также следуют, подписчики блога.

Я хочу сделать его эффективным, он должен будет запускаться 100 000 раз, если есть 100 000 блогов. , Его нужно будет запускать только изредка, но он может "cra sh", если превосходит доступные ресурсы.

Для первой части запроса я делаю LIMIT и использую случайные данные:

SELECT user_id FROM follows WHERE blog_id=4 ORDER BY rand() LIMIT 2000

Так что, если у блога есть 20 000 подписчиков, мне не нужно получать их все, чтобы иметь достаточно данных, а rand() обеспечивает эту случайность, поэтому я буду не просто выбирать старых неактивных или новых пользователей, но в среднем user.

Наибольшую озабоченность вызывает вторая часть , где, если эти 2000 пользователей в целом соблюдают 80% блогов, это создаст временную таблицу значений 80k, что должны быть заказаны.

SELECT blog_id, COUNT(*) FROM (SELECT user_id FROM follows WHERE blog_id=4 ORDER BY rand() LIMIT 2000)fw JOIN follows ON fw.user_id = follows.user_id GROUP BY blog_id

Этот запрос начнет подсчет всех подписчиков (из выбранных пользователей) каждого blog_id ASC. Если я добавлю LIMIT, он не достигнет более новых блогов, а если я подам ORDER BY rand(), он просто посчитает некоторые блоги, 100% подписчиков или ни одного.

Как бы вы подошли к этому? Видите ли вы какие-либо улучшения в моем запросе / подходе?

CREATE TABLE `follows` (
 `user_id` int(10) unsigned NOT NULL,
 `blog_id` int(10) unsigned NOT NULL,
 PRIMARY KEY (`user_id`,`blog_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

PD: Позже я планирую сравнить один список с другими, поэтому знаменитый блог не станет наиболее связанным с большинством блогов. должно быть "столкновение" последователей обоих Блогов, чтобы занять место в связанных списках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...