MySQL не блокирует таблицу автоматически, и возможно, что вы потеряете некоторые записи между получением счетчика и выполнением усечения. Таким образом, два решения выскакивают у меня:
1) Используйте блокировки таблиц для предотвращения обновления таблицы памяти - в зависимости от характера вашего приложения это означает, что все ваши клиенты могут зависать на несколько секунд во время обновления, это может быть в порядке.
2) Добавьте второй столбец , чтобы отслеживать, какие записи вы в настоящее время обновляете ...
ALTER TABLE `-views` ADD work_in_progress TINYINT NOT NULL DEFAULT 0;
А потом, когда вы захотите поработать над этими записями
UPDATE `-views` SET work_in_progress = 1;
SELECT COUNT(*) AS period_views, `item_id` FROM `-views` WHERE work_in_progress GROUP BY `item_id` ORDER BY `item_id`;
# [ perform updates as necessary ]
DELETE FROM `-views` WHERE work_in_progress;
Эта реализация гарантирует, что вы не удалите -views
, которые были добавлены во время обновления.
И FWIW, -views
- это ужасное имя для таблицы!