Если вы говорите, что с запросом есть ограничение по времени, вы можете использовать хранимую процедуру для пропуска определенных обновлений
Примерно так:
DELIMITER $$
DROP PROCEDURE IF EXISTS `updateStats` $$
CREATE PROCEDURE updateStats ()
BEGIN
DECLARE _B smallint(1) DEFAULT 0;
DECLARE _SECONDS INT DEFAULT 1;
-- http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html
SELECT GET_LOCK('myLabel1',_SECONDS) INTO _B;
IF _B = 1 THEN
UPDATE table SET ........;
SLEEP(_SECONDS);
SELECT RELEASE_LOCK('myLabel1') INTO _B;
END IF;
END
Это гарантирует, что если вы получили блокировку, которая длится _SECONDS, вы убедитесь, что никакая другая процедура не запускает тот же код в этот период времени.
Спящий режим необходим для удержания блокировки в течение 1 секунды (как будто SP завершается раньше, блокировка снимается)
Вы также можете добавить узел else
в if, чтобы хранимая процедура не могла обновиться для выполнения пользовательского кода, например добавления в очередь.
Предположим, вы хотите записывать в живую таблицу только с интервалом в 1 секунду, чтобы не загружать ее слишком часто, возможно, у вас много индексов. На узле else вы можете обновить вторую таблицу, которая действует как очередь, и очередь также очищается в истинном узле IF, когда вы также производите обновление.