Транзакції, пачками по 300-500-1000, треба підбирати краще значення перебором, іншого начебто нічого не придумали поки. І що за апдейти які на 200к займають годину? Нормальний запит виконується 0,001 сек, на 1000 піде секунда, значить на 60к потрібно хвилину часу. 150к максимум 3 хвилини. Можливо що з базою щось не так, перевірте швидкість роботи update, зробіть explain, подивіться які індекси потрібно додати.
Я роблю так, якщо потрібно дуже багато оновлювати:
* Спочатку створюємо тимчасову таблицю з двома полями: Id, balance. тип таблиці і тип полів такі ж як в "users";
* Дані зливаємо в тимчасовий csv-файл;
* Потім робимо "load data local infile" з csv-файлу в тимчасову таблицю;
* Потім оновлюємо цільову таблицю: "update users inner join users_update_tmp on users.id = users_update_tmp.id set users.balance = users_update_tmp.balance";
* Потім видаляємо тимчасову таблицю;
* Видаляємо тимчасовий файл.
Не забудьте тільки повісити ключ на поле id в тимчасовій таблиці, щоб Джойн в команді update працював ефективно.
Кілька мільйонів кортежів така схема перетравлює легко. Найважче - злити дані в csv-файл.
У нас зараз якраз працює окрема таблиця як і ви написали і робимо висновок балансу через join ..
але її постійно потрібно чистити (якщо не почистити більше 1-2 діб) запит лягати.