Задавайте вопросы, мы ответим
Вы не зашли.
Недавно столкнулся с проблемой удаления большого кол-во записей из таблицы с очень большим кол-вом записей. Хотел я удалить статистику за определённый промежуток времени из 3-х таблиц stats, stats2, stats3 в которых по 10 000 000 записей.
Структура таблиц очень простая: ID (примари), VALUE, DATE (проставлен индекс)
+ в качестве значения для DATE использую время в формате UNIX
Проблема в том, что удаление идёт очень долго, мин. 20-25 точно. Всю таблицу если сбрасывать, то конечно за пару секунд запрос обработается, но такой вариант не очень подходит.
Что делать? Смотреть в сторону партиций или можно и без них?
Неактивен
Что показывает EXPLAIN SELECT с тем же условием WHERE, что операция на удаление?
Неактивен
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test ALL date NULL NULL NULL 93972660 Using where
Отредактированно NetWork (21.11.2008 09:17:59)
Неактивен
Можно разбивать DELETE на кусочки. Выполнять сначала SELECT (возможно + LIMIT), а затем уже DELETE по первичному ключу (WHERE ID IN (11,17,33,2230)). В случае Innodb к тому же такой DELETE не будет блокирующим другие запросы.
Неактивен
А полный запрос покажите, пожалуйста. Есть ощущение, что RANGE таки должен использоваться тут.
Неактивен
Отредактированно NetWork (22.11.2008 18:21:13)
Неактивен
если date_unix не первичный ключ, то запрос будет блокировать всю таблицу. Если есть id - первичный ключ с автоинкрементом, то лучше переформулировать запрос через WHERE id <= X
Неактивен
Странно, что при этом он не использует ключ на date_unix...
Неактивен
Блокировка в Innodb происходит по первичному ключу. Но блокировка должна быть быстрой. Если ради блокировки надо обойти вторичный ключ и найти значения первичного ключа, соответствующие диапазону вторичного, то сама блокировка может быть дольше, чем запрос. По такому пути InnoDB не идет, но можно пойти самостоятельно, если требуется.
Неактивен
Еще вот что интересно: что показывает SHOW INNODB STATUS во время выполнения этого запроса?
И сколько записей в результате удаляется?
Неактивен