SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.11.2008 08:08:26

NetWork
Участник
Зарегистрирован: 13.04.2008
Сообщений: 8

Долгий DELETE

Недавно столкнулся с проблемой удаления большого кол-во записей из таблицы с очень большим кол-вом записей. Хотел я удалить статистику за определённый промежуток времени из 3-х таблиц stats, stats2, stats3 в которых по 10 000 000 записей.
Структура таблиц очень простая: ID (примари), VALUE, DATE (проставлен индекс)
+ в качестве значения для DATE использую время в формате UNIX

Проблема в том, что удаление идёт очень долго, мин. 20-25 точно. Всю таблицу если сбрасывать, то конечно за пару секунд запрос обработается, но такой вариант не очень подходит.

Что делать? Смотреть в сторону партиций или можно и без них?

Неактивен

 

#2 21.11.2008 08:56:40

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Долгий DELETE

Что показывает EXPLAIN SELECT с тем же условием WHERE, что операция на удаление?

Неактивен

 

#3 21.11.2008 09:15:57

NetWork
Участник
Зарегистрирован: 13.04.2008
Сообщений: 8

Re: Долгий DELETE

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)

Неактивен

 

#4 21.11.2008 09:44:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Долгий DELETE

Можно разбивать DELETE на кусочки. Выполнять сначала SELECT (возможно + LIMIT), а затем уже DELETE по первичному ключу (WHERE ID IN (11,17,33,2230)). В случае Innodb к тому же такой DELETE не будет блокирующим другие запросы.

Неактивен

 

#5 21.11.2008 14:22:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Долгий DELETE

А полный запрос покажите, пожалуйста. Есть ощущение, что RANGE таки должен использоваться тут.

Неактивен

 

#6 22.11.2008 18:16:27

NetWork
Участник
Зарегистрирован: 13.04.2008
Сообщений: 8

Re: Долгий DELETE


DELETE
FROM talbe
WHERE date_unix <= 27362234

Отредактированно NetWork (22.11.2008 18:21:13)

Неактивен

 

#7 22.11.2008 18:26:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Долгий DELETE

если date_unix не первичный ключ, то запрос будет блокировать всю таблицу. Если есть id - первичный ключ с автоинкрементом, то лучше переформулировать запрос через WHERE id <= X

Неактивен

 

#8 23.11.2008 10:53:45

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Долгий DELETE

Странно, что при этом он не использует ключ на date_unix...

Неактивен

 

#9 23.11.2008 11:10:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Долгий DELETE

Блокировка в Innodb происходит по первичному ключу. Но блокировка должна быть быстрой. Если ради блокировки надо обойти вторичный ключ и найти значения первичного ключа, соответствующие диапазону вторичного, то сама блокировка может быть дольше, чем запрос. По такому пути InnoDB не идет, но можно пойти самостоятельно, если требуется.

Неактивен

 

#10 01.12.2008 19:57:35

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Долгий DELETE

Еще вот что интересно: что показывает SHOW INNODB STATUS во время выполнения этого запроса?

И сколько записей в результате удаляется?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson