2010-01-20 3 views
0

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

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

+0

@clops: В документах я заметил, что UPDATE LOW_PRIORITY и ISERT DELAYED не работают для InnoDB, поэтому удаленный ответ. – Veger

+0

Нет проблем! Спасибо, в любом случае! – clops

ответ

0

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

Что-то вроде этого:

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 

Это позволит убедиться, что если вы получили Lock, который длится для _SECONDS, вы убедитесь, что никакая другая процедура не запускает тот же код в этом временном кадре. сон необходим, чтобы сохранить замок в течение 1 секунды (как если SP заканчивается раньше, блокировка снимается)

Вы также можете добавить else узел в случае, так это хранимая процедура не может обновлять, чтобы сделать пользовательский код, например, добавить в очередь.

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

1

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

0

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

Смежные вопросы