Общепринятая практика работы с высоконагруженными таблицами в MySQL

У меня есть таблица в MySQL 5 (InnoDB), которая используется в качестве очереди обработки демона, поэтому к ней обращаются очень. Обычно в день вставляется около 250 000 записей. Когда я выбираю записи для обработки, они считываются с использованием запроса FOR UPDATE для устранения условий гонки (все основано на транзакциях).

Сейчас я разрабатываю "архив очередей" и столкнулся с серьезной проблемой тупиковой блокировки. Мне нужно удалить «исполненные» записи из таблицы по мере их обработки (в реальном времени), но таблица время от времени блокируется, если я это делаю (два-три раза в день).

Я хотел бы перейти к отложенному удалению (один раз в день при низкой нагрузке), но это не решит проблему, а только сделает ее менее очевидной.

Существует ли обычная практика работы с таблицами с высокой нагрузкой в ​​MySQL?


person clops    schedule 12.10.2009    source источник


Ответы (1)


InnoDB блокирует все просматриваемые строки, а не только запрошенные.

Подробнее см. этот вопрос.

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

К сожалению, DML запросы в MySQL не принимают подсказки.

person Quassnoi    schedule 12.10.2009
comment
Хм, интересно. Что, если я использую SELECT id FROM table WHERE foo = bar LIMIT 1 FOR UPDATE -- будет ли это гарантировать, что будет заблокирована только одна строка? - person clops; 12.10.2009
comment
Нет. Если оптимизатор выберет полное сканирование таблицы, он заблокирует все проверенные строки до того, как механизм найдет первую строку, соответствующую критериям. - person Quassnoi; 12.10.2009