Страница 1 из 1
Ротация таблицы
Добавлено: 2008-08-28 10:23:34
kapa6ac
Доброго дня.
Из базы для меня необходимы данные не позднее двухнедельной давности и не хочется чтобы база разрасталась.
Отсюда и вопрос как на автомате удалять устаревшие данные? Искал встроенные функции, что-то такого нет.

Re: Ротация таблицы
Добавлено: 2008-08-28 10:31:41
dikens3
Завести соответствующее поле (date) и по крону очищать.
Re: Ротация таблицы
Добавлено: 2008-08-28 11:19:04
kapa6ac
Это я понимаю колонка типа timestamp?
Код: Выделить всё
DELETE FROM t_name WHERE t_stamp = NOW()-INTERVAL 1 WEEK;
так?
И все это счастье положить в крон?
Re: Ротация таблицы
Добавлено: 2008-08-29 6:48:46
manefesto
написать скрипт на баше, хоть на перле.
А в нем уже непосрественно саму операцию удаления.
Re: Ротация таблицы
Добавлено: 2008-08-29 9:08:14
kapa6ac
... или лыжи не едут или снег асфальтом покрыли...
Что-то никакой реакции на запрос:
Код: Выделить всё
SELECT @t:=NOW() - INTERVAL 1 WEEK;
DELETE FROM t_name WHERE t_stamp < @t;
В чем грабли? Ошибок не выдает, просто тупо молчит, выполняется ли он?
Re: Ротация таблицы
Добавлено: 2008-08-29 9:21:55
zg
Код: Выделить всё
mysql> SELECT NOW(), SUBDATE(NOW(), INTERVAL 1 WEEK);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'WEEK)
' at line 1
mysql> SELECT NOW(), SUBDATE(NOW(), INTERVAL 14 DAY);
+---------------------+---------------------------------+
| NOW() | SUBDATE(NOW(), INTERVAL 14 DAY) |
+---------------------+---------------------------------+
| 2008-08-29 12:33:25 | 2008-08-15 12:33:25 |
+---------------------+---------------------------------+
1 row in set (0.00 sec)
mysql>
Код: Выделить всё
mysql> SELECT version();
+------------+
| version() |
+------------+
| 4.1.15-max |
+------------+
1 row in set (0.00 sec)
mysql>
Re: Ротация таблицы
Добавлено: 2008-08-29 9:35:21
kapa6ac
Код: Выделить всё
mysql> select @t:=subdate(now(),interval 1 day);
+-----------------------------------+
| @t:=subdate(now(),interval 1 day) |
+-----------------------------------+
| 2008-08-28 10:31:17 |
+-----------------------------------+
1 row in set (0.00 sec)
mysql> select @t;
+---------------------+
| @t |
+---------------------+
| 2008-08-28 10:31:17 |
+---------------------+
1 row in set (0.01 sec)
mysql> delete quick from t_name where t_stamp < @t;
И на этом уже минут 5 тупит.

Что не так делаю?
Re: Ротация таблицы
Добавлено: 2008-08-29 9:49:43
LMik
DELETE FROM ТАБЛИЦА WHERE ПОЛЕ_С_ДАТОЙ < NOW()-INTERVAL 1 WEEK;
Re: Ротация таблицы
Добавлено: 2008-08-29 9:52:20
zg
выложи
Код: Выделить всё
explain select * from t_name where t_stamp < 1;
Re: Ротация таблицы
Добавлено: 2008-08-29 10:44:38
kapa6ac
Код: Выделить всё
mysql> explain select * from rejects where d_time < 1;
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | rejects | ALL | NULL | NULL | NULL | NULL | 528887 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
1 row in set, 1 warning (37.73 sec)
mysql>
Re: Ротация таблицы
Добавлено: 2008-08-29 15:04:31
zg
полмиллиона записей в принципе немного, но индекса нет, поэтому выборка идёт по всем записям, что не есть харашо. Я бы советовал отказаться от timestamp в пользу date и создать простой индек на это поле, тогда и выборка и удаление записей по дате будут занимать доли секунд.