Попытка быстро выбрать и обновить те же строки

0

У меня есть таблица 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 быстро, как я описал?

Теги:

1 ответ

0
Лучший ответ

Создайте уникальный идентификатор для каждого script (просто случайное целое обычно работает отлично для этих целей).

Запустите запрос UPDATE table SET status = <my random id> WHERE status = 0 LIMIT 500 от каждого процесса.

Затем каждый процесс запускает SELECT ... FROM table WHERE status = <my random id>, чтобы получить строки.

По сути, вы сначала "блокируете" строки для текущего script, а затем возвращаете те, которые вы успешно заблокировали.

  • 0
    Сэр, это гениальная идея, о которой я не думал. Большое спасибо.
  • 0
    Привет, один быстрый вопрос: если у меня есть cron, запускающий несколько скриптов одновременно, и все они берут 500 строк в одном и том же порядке и обновляют их, есть ли высокая вероятность того, что одни и те же строки будут обновляться более одного раза? Мне нужно, чтобы он был уникальным.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню