Выпуск обновлений с низким приоритетом - PullRequest
0 голосов
/ 20 января 2010

Есть ли способ выполнить обновления с низким приоритетом в MySQL при использовании InnoDB?

Я использую приложение с очень высокой нагрузкой, в котором могут быть буквально тысячи пользователей, пытающихся одновременно обновлять одни и те же записи данных. В основном это статистическая информация на основе сеанса, большая часть которой может быть проигнорирована в случае, если с запросом есть время ожидания. Я хотел бы иметь возможность проверить, заблокирована ли какая-то таблица / строка, и если это так, просто не передавать запрос на обновление на сервер. Это возможно?

Ответы [ 3 ]

1 голос
/ 06 января 2011

вы пытались установить low_priority_updates=1 в вашем файле my.cnf? Это должно дать приоритет запросам выбора, когда обновление или вставка могли бы заблокировать таблицу.

0 голосов
/ 06 января 2011

Таким образом, ваше пользовательское приложение не ожидает завершения обновления и не заботится о том, не завершено ли оно, возможно, это подходящий контекст для использования менеджера фоновой обработки, например Gearman

0 голосов
/ 24 ноября 2010

Если вы говорите, что с запросом есть ограничение по времени, вы можете использовать хранимую процедуру для пропуска определенных обновлений

Примерно так:

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, когда вы также производите обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...