У меня есть таблица MySQL, которая очень часто обновляется. По сути, я пытаюсь захватить 500 строк с несколькими скриптами PHP сразу, и я не хочу, чтобы скрипты PHP захватывали одни и те же строки. Я не использую ORDER BY RAND() из-за нагрузки на сервер с тысячами строк.
Итак, я думал о том, что каждый script устанавливает каждый статус строки как "1" (поэтому он не будет снова схвачен). Итак, я хочу захватить 500 строк, где status = 0 (я использую порядок SELECT по asc), а затем эти точные 500 строк устанавливаются в состояние "1", так что другой script не захватывает их.
Поскольку таблица постоянно обновляется, я не могу выбрать 500 строк по порядку asc, а затем обновлять 500 строк по строкам asc, потому что к моменту, когда требуется начать script и сделать SELECT, больше строки могут быть добавлены.
Поэтому мне нужен способ SELECT 500 строк, а затем как-то "помнить", какие строки я выбрал и обновил их.
Как я буду делать SELECT и UPDATE быстро, как я описал?
Создайте уникальный идентификатор для каждого script (просто случайное целое обычно работает отлично для этих целей).
Запустите запрос UPDATE table SET status = <my random id> WHERE status = 0 LIMIT 500
от каждого процесса.
Затем каждый процесс запускает SELECT ... FROM table WHERE status = <my random id>
, чтобы получить строки.
По сути, вы сначала "блокируете" строки для текущего script, а затем возвращаете те, которые вы успешно заблокировали.