Страница 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 и создать простой индек на это поле, тогда и выборка и удаление записей по дате будут занимать доли секунд.