> Еще один вариант, не знаю подойдет ли он вам, партиции в 5.1. Для вас думаю возможен вариант с alter table truncate partition ..., и факт того, что индексы локальные тоже должен помочь, нет глобального индекса — не останется хвостов от удаленных данных. Из минусов, ну их даже в официальной документации много. И еще тут много зависит от того, как у вас организованы данные, простейший вариант с датой временем, по ним можно побить данные и очищать устаревающие данные.
про партиции, спасибо, почитаю
про биение данных, мысль хороша, но есть определенные трудности. текущая таблица используется во множестве отчетов, которые прийдется переписывать, тк они строятся на локальном времени пользователей, а время в таблице установлено в гринвиче.
хотя я вот сейчас подумала, может есть возможность использовать для этого редставления? хотя я не видела, чтобы именно таким образом ими пользовались
> и предполагается что трудно спрогнозировать отсутствие загрузки
ставим на крон проверку нагрузки сервера, и если она ниже какого-то предела, то физически удаляем часть записей?
Кстати, а если понемногу удалять записи, например по 10000 в минуту, по идее, если запрос успеет отработаться за минуту, то полное удаление 20 млн записей должно пройти за примерно 2000 минут, т.е меньше часа. Что в принципе может устроить… однако я вот не в курсе на счет а) того что за минуту 10000 записей успеет удалится, б) оптимизацию таблицы следует проводить после того как все данные будут удалены.
условие трудно прогнозируемого отсутствия загрузки оказалось критичным, т.к. в один момент времени нагрузка на БД может быть очень маленькая и уже в следующую секунду она может подскочить.
>> и предполагается что трудно спрогнозировать отсутствие загрузки
> ставим на крон проверку нагрузки сервера, и если она ниже какого-то предела, то физически удаляем часть записей?
окей, вариант принят, но думалось может есть другие варианты
плюс, где бы я ни читала о чистках базы, везде говорилось, что лучше создать новую таблицу с нужными данными + дропнуть ту, которая со старыми, чем удалять не нужные строки и оптимизировать. по-моему там какая-то беда с индексами происходит
без понятия :), а как это узнать?
в общем-то тут уже прозвучал ответ, который очень помог:
@echo off
tasklist | find «your_service_name.exe» > null
IF %ERRORLEVEL% NEQ 1 GOTO EXIT
net start your_service_name
:EXIT
exit 0
Падает :(