Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление из большой базы / 25 сообщений из 42, страница 1 из 2
12.03.2015, 10:21:20
    #38902103
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Всем привет! Попросили помочь обслужить бд. Имеется база данных Mysql размером порядка 180 Gb из этого 130 data и 50 index lenght, rows 840 000 000. Необходимо удалить старые данные.
Сделал процедуру

CREATE DEFINER=`root`localhost` PROCEDURE `name`()
Begin
Declare i int default 0;
while i<1000000 do
DELETE FROM бд.таблица WHERE дата<заданной limit 1000;
set i=i+1;
end while;
end

Работает, но очень медленно и грустно. Порой данные быстрее добавляются, чем удаляются.

Подскажите, как можно еще решить проблему?
...
Рейтинг: 0 / 0
12.03.2015, 10:39:12
    #38902136
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
А зачем такая процедура?
Уж если удалять процедурой, растаскивая процесс по времени - то итерировать надо не по количеству, а по дате, начиная с заведомо более старой, чем у самой старой записи:

Код: sql
1.
2.
3.
4.
5.
SET @date = '2000-01-01';
WHILE @date < 'требуемая дата'
DELETE FROM table WHERE `date` = @date;
SET @date = @date + INTERVAL 1 DAY;
END WHILE;
...
Рейтинг: 0 / 0
12.03.2015, 10:39:54
    #38902138
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Если порция получается великоватой - уменьшить интервал с суток до, скажем, пары часов.
Ну и наличие индекса по дате не повредит.
...
Рейтинг: 0 / 0
12.03.2015, 10:42:05
    #38902142
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Akina, Спасибо! Попробую!
...
Рейтинг: 0 / 0
12.03.2015, 10:42:16
    #38902143
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewer,

Возможно, было бы легче нужные данные скопировать в новую таблицу, а затем дропнуть целиком старую.
...
Рейтинг: 0 / 0
12.03.2015, 10:42:33
    #38902145
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Akina, Не совсем понял, как сделать индекс по дате?
...
Рейтинг: 0 / 0
12.03.2015, 10:44:26
    #38902147
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewerAkina, Не совсем понял, как сделать индекс по дате?А у вас его еще нет???
С индексом, вероятно, и исходный код заработает веселее.
...
Рейтинг: 0 / 0
12.03.2015, 10:44:32
    #38902148
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
miksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить...
...
Рейтинг: 0 / 0
12.03.2015, 10:45:45
    #38902151
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
miksoft,
подскажите, как его реализовать?
...
Рейтинг: 0 / 0
12.03.2015, 10:46:26
    #38902153
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewermiksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить...Думаю, не больше, чем такое порционное удаление. Кроме того, физически таблица получится куда более "плотная", что положительно скажется на ее дальнейшей жизни.
...
Рейтинг: 0 / 0
12.03.2015, 11:38:57
    #38902207
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
ну и в дополнение к вышесказанному (если уж делать так делать), можно использовать PARTITION BY RANGE, в дальнейшем удалять более старые части ALTER TABLE Tabl DROP PARTITION p0;
...
Рейтинг: 0 / 0
12.03.2015, 12:50:23
    #38902319
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewerВсем привет! Попросили помочь обслужить бд. Имеется база данных Mysql размером порядка 180 Gb из этого 130 data и 50 index lenght, rows 840 000 000. Необходимо удалить старые данные.
Сделал процедуру

CREATE DEFINER=`root`localhost` PROCEDURE `name`()
Begin
Declare i int default 0;
while i<1000000 do
DELETE FROM бд.таблица WHERE дата<заданной limit 1000;
set i=i+1;
end while;
end

Работает, но очень медленно и грустно. Порой данные быстрее добавляются, чем удаляются.

Подскажите, как можно еще решить проблему?


Без COMMIT в цикле в InnoDB эта процедура бессмысленна (вредна даже).
В MyISAM и с COMMIT, и без него процедура бессмысленна и вредна.
Без индекса по "дата" -- вообще самоубийство.
...
Рейтинг: 0 / 0
12.03.2015, 12:57:31
    #38902333
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
miksoftvlrewermiksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить...Думаю, не больше, чем такое порционное удаление. Кроме того, физически таблица получится куда более "плотная", что положительно скажется на ее дальнейшей жизни.

Alex_Ustinovну и в дополнение к вышесказанному (если уж делать так делать), можно использовать PARTITION BY RANGE, в дальнейшем удалять более старые части ALTER TABLE Tabl DROP PARTITION p0;

MasterZivvlrewerВсем привет! Попросили помочь обслужить бд. Имеется база данных Mysql размером порядка 180 Gb из этого 130 data и 50 index lenght, rows 840 000 000. Необходимо удалить старые данные.
Сделал процедуру

CREATE DEFINER=`root`localhost` PROCEDURE `name`()
Begin
Declare i int default 0;
while i<1000000 do
DELETE FROM бд.таблица WHERE дата<заданной limit 1000;
set i=i+1;
end while;
end

Работает, но очень медленно и грустно. Порой данные быстрее добавляются, чем удаляются.

Подскажите, как можно еще решить проблему?


Без COMMIT в цикле в InnoDB эта процедура бессмысленна (вредна даже).
В MyISAM и с COMMIT, и без него процедура бессмысленна и вредна.
Без индекса по "дата" -- вообще самоубийство.

Всем спасибо за ответы! Осталось не ясным как проверить есть ли индексы в базе по дате или нет? т.к. база не моя..
...
Рейтинг: 0 / 0
12.03.2015, 12:58:32
    #38902334
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewer,

Код: sql
1.
show create table XXX;
...
Рейтинг: 0 / 0
12.03.2015, 13:05:43
    #38902343
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
MasterZiv,

Key 'date_obj' оно?
...
Рейтинг: 0 / 0
12.03.2015, 13:27:02
    #38902372
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewer,

нет. Оно - это key `rec_date`
...
Рейтинг: 0 / 0
12.03.2015, 13:27:47
    #38902375
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Akina, MasterZiv,
Руки кривые походу, такой код получился:

CREATE PROCEDURE `db`.`del` ()
BEGIN
SET autocommit=0;
SET @date='2011-01-01';
WHILE @date<'2013-01-01'
DELETE from db.records where REC_DATE = @date;
SET @date = @date + INTERVAL 1 DAY;
END WHILE;
commit;
SET autocommit=1;
END

Ругается на синтаксис
...
Рейтинг: 0 / 0
12.03.2015, 13:30:40
    #38902385
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
vlrewerAkina, MasterZiv,
Руки кривые походу, такой код получился:

CREATE PROCEDURE `db`.`del` ()
BEGIN
SET autocommit=0;
SET @date='2011-01-01';
WHILE @date<'2013-01-01'
DELETE from db.records where REC_DATE = @date;
SET @date = @date + INTERVAL 1 DAY;
END WHILE;
commit;
SET autocommit=1;
END

Ругается на синтаксис

COMMIT должен быть ВНУТРИ цикла.
...
Рейтинг: 0 / 0
12.03.2015, 13:31:40
    #38902387
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Код: sql
1.
SET @date = @date + INTERVAL 1 DAY;



Это ты в оракле такого понахватался ?
Я далеко не уверен, что такое есть в MySQL.
...
Рейтинг: 0 / 0
12.03.2015, 14:44:21
    #38902512
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Так у кого-нить есть идея как правильно цикл задать?
BEGIN
SET autocommit=0;
declare sdate DATETIME:
set sdate='2011-01-01 00:00:00'; - ругается на эту
WHILE sdate<'2013-01-01 00:00:00' - ругается на эту
DELETE from db.records where REC_DATE = sdate;
SET sdate = sdate + INTERVAL 1 DAY; - ругается на эту
COMMIT;
END WHILE;

SET autocommit=1;
END

Видимо придется опять в цикл с while i<1000000 do
DELETE FROM бд.таблица WHERE дата<заданной limit 1000;
set i=i+1; но уже с COMMIT
...
Рейтинг: 0 / 0
12.03.2015, 14:57:24
    #38902529
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
tanglir,

Тогда хорошо!)
...
Рейтинг: 0 / 0
12.03.2015, 15:39:18
    #38902608
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Блин, что у тебя с руками, а?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
mysql> CREATE TABLE `table` (`date` DATETIME);
Query OK, 0 rows affected (0.45 sec)

mysql> INSERT INTO `table`
    -> SELECT '2015-01-01' UNION ALL
    -> SELECT '2015-01-10' UNION ALL
    -> SELECT '2015-01-20' UNION ALL
    -> SELECT '2015-01-30' UNION ALL
    -> SELECT '2015-02-01' UNION ALL
    -> SELECT '2015-02-02' ;
Query OK, 6 rows affected (0.09 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> DELIMITER $$
mysql> CREATE PROCEDURE MyDelete()
    -> BEGIN
    -> SET @date = '2015-01-10';
    -> WHILE @date < '2015-02-01' DO
    -> DELETE FROM `table` WHERE `date` = @date;
    -> SET @date = @date + INTERVAL 1 DAY;
    -> END WHILE;
    -> END;
    -> $$
Query OK, 0 rows affected (0.10 sec)

mysql> DELIMITER ;
mysql> SELECT * FROM `table`;
+---------------------+
| date                |
+---------------------+
| 2015-01-01 00:00:00 |
| 2015-01-10 00:00:00 |
| 2015-01-20 00:00:00 |
| 2015-01-30 00:00:00 |
| 2015-02-01 00:00:00 |
| 2015-02-02 00:00:00 |
+---------------------+
6 rows in set (0.02 sec)

mysql> CALL MyDelete;
Query OK, 0 rows affected (0.15 sec)

mysql> SELECT * FROM `table`;
+---------------------+
| date                |
+---------------------+
| 2015-01-01 00:00:00 |
| 2015-02-01 00:00:00 |
| 2015-02-02 00:00:00 |
+---------------------+
3 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
12.03.2015, 16:24:20
    #38902705
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Akina,

тоже commit забыл
...
Рейтинг: 0 / 0
12.03.2015, 16:27:35
    #38902710
vlrewer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
Akina,

Спасибо большое, я ваш должник!) у меня заработал ваш вариант, когда в строке DELETE FROM `table` WHERE `date` = @date; моя таблица без кавычек и столбец без кавычек, т.е. DELETE FROM records WHERE rec_date = @date;
...
Рейтинг: 0 / 0
12.03.2015, 16:34:08
    #38902721
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из большой базы
MasterZivcommit забылА нафига он тут? у меня и транзакции-то нету, так что результат выполнения каждого DELETE сразу и коммиттится.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление из большой базы / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]