Обычная практика в работе с таблицами высокой нагрузки в MySQL
У меня есть таблица в MySQL 5 (InnoDB), которая используется в качестве очереди обработки демона, поэтому к ней обращаются очень часто. Обычно в день вставляется около 250 000 записей. Когда я выбираю записи для обработки, они читаются с использованием запроса FOR UPDATE для устранения условий гонки (все основано на транзакциях).
Сейчас я занимаюсь разработкой "архива очереди" и столкнулся с серьезной проблемой тупиковой блокировки. Мне нужно удалять "выполненные" записи из таблицы, когда они обрабатываются (в реальном времени), но таблица периодически блокируется, если я это делаю (два-три раза в день в).
Я хотя и иду к отложенному удалению (один раз в день при низкой загрузке), но это не устранит проблему, а только сделает ее менее очевидной.
Есть ли обычная практика в работе с таблицами высокой нагрузки в MySQL?
1 ответ
InnoDB
блокирует все проверяемые строки, а не только те, которые были запрошены.
Смотрите этот вопрос для более подробной информации.
Вам нужно создать индекс, который бы точно соответствовал вашему условию поиска, чтобы избавиться от ненужных блокировок и убедиться, что он используется.
К несчастью, DML
запросы в MySQL
не принимайте подсказки.