Для сайта микроблогов, где создание блога очень просто, поэтому я работаю с + 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: Позже я планирую сравнить один список с другими, поэтому знаменитый блог не станет наиболее связанным с большинством блогов. должно быть "столкновение" последователей обоих Блогов, чтобы занять место в связанных списках.