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

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

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

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

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

1 Ответ

1 голос
/ 12 октября 2009

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

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

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

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

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