Массовое обновление MySQL, флаги обновления зарегистрированных, незарегистрированных пользователей - PullRequest
0 голосов
/ 14 января 2019

В моей текущей таблице зарегистрированы пользователи a, b, c, d, e, f.

Затем я получаю полный список всех зарегистрированных пользователей, в котором перечислены c, d, e, f, g h.

Это означает, что a, b имеют незарегистрированных пользователей, а g, h являются новыми зарегистрированными пользователями.

Примечание *: Нет события, которое сообщало бы мне, когда пользователь регистрируется или отменяет регистрацию. Только список всех зарегистрированных пользователей, к которым я не хочу обращаться чаще, чем раз в день.

Мой текущий метод обновления MySQL:

UPDATE users SET registered = -1 WHERE registered = 1;

Затем я обновляю таблицу новым списком всех зарегистрированных пользователей:

INSERT INTO users (id, registered) VALUES($userid[i], 1) ON DUPLICATE KEY UPDATE registered = 1;

Затем я продолжаю обновлять таблицу, отмечая пользователей, которые не зарегистрировались:

UPDATE users SET registered = 0, unregistered = 1 WHERE registered = -1;

В основном используя -1 как индикатор того, что пользователь был зарегистрирован, но больше не в соответствии с полным списком;

Это отлично работает с маленьким столом, но занимает часы с десятками тысяч.

Есть ли лучший способ?

Сокращение до нескольких минут было бы более чем приемлемым.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Секрет в том, чтобы выбросить противного UPDATE.

Вместо столбца registered, являющегося каким-либо флагом, сделайте его DATETIME.

Теперь тест на WHERE ts < NOW() - INTERVAL 1 DAY - Нет необходимости менять registered ежедневно!

Когда вы воздействуете на один из предметов, просто обновите его с помощью UPDATE ... ts = NOW() WHERE id = ....

0 голосов
/ 14 января 2019

вы можете использовать where in как так

UPDATE users set registered = 1 WHERE id in (implode($userid,','))

вы взорвали идентификаторы пользователей

оператор sql должен выглядеть следующим образом

UPDATE users set registered = 1 WHERE id in (1,2,3,5)

Редактировать: вот ссылка на пакетную вставку mysql Как сделать пакетную вставку в MySQL

...