Попытка удалить 1000 записей журнала, но если доступно только 999, я получаю тайм-аут - PullRequest
1 голос
/ 04 апреля 2019

Итак, вот что я попробовал до сих пор:

DELETE FROM Log WHERE LogTime < DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY ID LIMIT 1000

Я пытаюсь удалить 1000 строк из таблицы Log одновременно, чтобы это можно было сделать контролируемым образом и чтобыНе занимайте все ресурсы сервера MySQL.

Теперь к проблеме.Когда есть тысячи строк для удаления, это работает отлично.Кажется, так как я упорядочиваю по идентификатору, который является первичным ключом auto_increment, он будет начинаться с самого начала и занимать столько, сколько необходимо.Также увеличивается LogTime, поэтому первая строка имеет самую старую временную метку.

Проблема теперь в том, что у меня есть только 999 строк, которые должны быть удалены в соответствии с проверкой LogTime

Есть ли какой-либо способ сказать mysql только удалять, пока не найдет больше совпадений в порядке поиска?

1 Ответ

2 голосов
/ 04 апреля 2019

Поместите индекс в ваш столбец LogTime.Затем удалите ORDER BY ID из вашего запроса DELETE.Тогда удаление ваших партий из 1000 (или менее) строк должно быть эффективным.

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

Но если ваша схема удаления пакетов не требует поддержания порядка идентификаторов, это лучший выбор, особенно если таблица активна.Если вы повторно запускаете запрос DELETE до тех пор, пока он не удалит 0 строк, вам не нужно беспокоиться о строгом порядке ID.

Меньшие партии (50 или 100) свяжут вашу таблицу на более короткое время, уменьшая задержки для других пользователей таблицы.А использование одного индексированного столбца в предложении WHERE снижает вероятность тупика.

...