#mysql #sql-delete
#mysql #sql-удалить
Вопрос:
Итак, вот что я пробовал до сих пор:
DELETE FROM Log WHERE LogTime < DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY ID LIMIT 1000
Я пытаюсь удалить 1000 строк из журнала таблицы за раз, чтобы это можно было сделать контролируемым образом и чтобы это не занимало все ресурсы сервера mysql.
Теперь к проблеме. Когда есть тысячи строк для удаления, это работает отлично. Похоже, что, поскольку я заказываю по идентификатору, который является первичным ключом auto_increment, он начнется с самого начала и займет столько, сколько необходимо. Также время входа увеличивается, поэтому первая строка имеет самую старую временную метку.
Проблема в том, что теперь у меня есть только 999 строк, которые должны быть удалены в соответствии с проверкой LogTime < DATE_SUB(NOW (), ИНТЕРВАЛ 30 ДНЕЙ). Затем он выполнит поиск по всей таблице для последней 1 строки.
Есть ли какой-либо способ сообщить mysql удалять только до тех пор, пока он не найдет больше совпадений, в порядке, в котором он ищет?
Комментарии:
1. У вас есть индекс для LogTime? Это помогло бы MySQL узнать, что не следует продолжать поиск.
ORDER BY LogTime
вместоORDER BY ID
тоже может помочь.
Ответ №1:
Поместите индекс в свой LogTime
столбец. Затем удалите ORDER BY ID
из вашего запроса на УДАЛЕНИЕ. Тогда удаление ваших пакетов из 1000 (или меньше) строк должно быть эффективным.
Если вы должны гарантировать, что ваши пакеты удаления идут в строгом порядке идентификаторов, вам все равно нужен индекс, который я предложил. Ваш запрос будет выполнен нормально.
Но если ваша схема удаления пакетов не требует поддержания порядка идентификаторов, это лучший выбор, особенно если таблица активна. Если вы повторно запускаете запрос на УДАЛЕНИЕ, пока он не удалит 0 строк, вам не нужно беспокоиться о строгом порядке идентификаторов.
Меньшие пакеты (50 или 100) свяжут вашу таблицу на более короткое время, уменьшая задержки для других пользователей таблицы. И использование одного индексированного столбца в вашем WHERE
предложении уменьшает вероятность взаимоблокировки.
Комментарии:
1. На самом деле добавления индекса к столбцу LogTime было достаточно. Теперь это очень быстро. На самом деле я думал, что уже пробовал это, но, видимо, я, вероятно, допустил какую-то ошибку, когда попробовал это. Во всяком случае, теперь это работает отлично!