Удаление строк вызывает тайм-аут блокировки - PullRequest
4 голосов
/ 07 декабря 2009

Я получаю эти ошибки, когда пытаюсь удалить строки из таблицы. Особый случай здесь заключается в том, что я могу запустить 5 процессов одновременно.

Сама таблица является таблицей Innodb с ~ 4,5 миллионами строк. У меня нет индекса для столбца, используемого в моем предложении WHERE. Другие индексы работают как положено.

Это делается в транскрипции, сначала я удаляю записи, затем я вставляю замещающие записи, и только если все записи вставлены, транзакция будет зафиксирована.

Сообщение об ошибке:

Ошибка запроса: превышено время ожидания блокировки; попробуйте перезапустить транзакцию при выполнении команды DELETE FROM tablename WHERE = значение

Поможет ли это создать индекс для указанного столбца здесь? Должен ли я явно заблокировать строки?

Я нашел дополнительную информацию в вопросе # 64653 , но я не думаю, что она полностью покрывает мою ситуацию.

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

Ответы [ 2 ]

3 голосов
/ 07 декабря 2009

Индекс определенно поможет. Если вы пытаетесь заменить удаленные записи, я бы порекомендовал вам изменить ваш запрос, чтобы использовать обновление вместо УДАЛИТЬ, а затем ВСТАВИТЬ, если возможно:

INSERT INTO tableName SET
column2 = 'value2'
WHERE column = value
ON DUPLICATE KEY UPDATE
column2 = 'value2'
1 голос
/ 07 декабря 2009

Индекс определенно помогает. Я когда-то работал на БД, содержащей пользовательские данные. Иногда возникала проблема с веб-интерфейсом и удалением пользователя. В течение дня все работало нормально (хотя и довольно долго). Но ближе к вечеру время ожидания истекло, так как сервер БД был перегружен из-за обработки в конце дня. Ударил индекс по затронутому столбцу и с этого момента все прошло гладко.

...