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

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

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

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

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

1 ответ

Решение

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

Смотрите этот вопрос для более подробной информации.

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

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

Другие вопросы по тегам