Показать сообщение отдельно
Старый 03.09.2015, 17:20   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Оператор сравнения IN

Немного запутался когда ты говоришь "база". Ты имеешь ввиду "таблица"?
У тебя в одной таблице все пользователи, с колонкой "соц_сеть"?

И тебе нужно пробежаться по всем пользователям определенной соц сети, послать им оповещение (соц. сети API), и затем записать дату оповещения?

Я не совсем вижу вообще зачем тебе IN здесь.
Сортируешь по user_id (он не изменный и только увеличивается). И далее делаешь выборку например 128 пользователей, далее шлешь им оповещания и обновляешь им notification_date, при этом тут проще будет использовать user_id больше и меньше чем первый и последний в этом списке.

Затем делаешь снова ту же выборку, только уже с дополнительным условием: user_id > last_user_id - где last_user_id самый большой последний user_id. И повторяешь все те же операции как и раньше.
И так по циклу, пока возвратимый результат не вернет 0 записей.

Что-то типо (псевдокод)

var last_user_id 0;

// repeat as long as there are users
while(true) {
    
// select batch of users
    
users "SELECT users WHERE user_id > " last_user_id " AND social_network = 'vk' ORDER BY user_id ASC LIMIT 128";

    
// no more users left to notify
    
if (users.length === 0)
        break;

    
// send notification
    
for(user in users)
        
send_notification(user)

    
// get first user_id and last user_id
    
var first_user_id users[0].id;
    
last_user_id users[users.length 1].id;

    
// update notification date of users
    
"UPDATE users WHERE user_id >= " first_user_id " AND user_id <= " last_user_id " SET notification_date = date";

Такой подход масштабируется с любым размером таблицы. Если больше записей будет, он всего лишь займет немного дольше времени.
Также увеличивая размер batch'а (128 в данном примере), ты больше заполнишь оперативки, но можешь быстрее обработать всю таблицу, снизив число запросов и парсинга.

Также такие вещи нужно писать не в блокируемом языке, с учетом того что send_notification может блокировать. Если он блокирует (PHP или Python), то у тебя этот скрипт займет ужасно много времени.
В идеале тебе нужно делать скрипт где send_notification выполняется паралельно с ограниченным числом.
Также лучше вообще параллелить батчи тоже, паралельно обрабатывая скажем 8 пачек по 128 пользователей.

В node.js такое легко параллелизуется, и будет очень шустро работать.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (03.09.2015)