powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление из большой базы
25 сообщений из 42, страница 1 из 2
Удаление из большой базы
    #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
Удаление из большой базы
    #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
Удаление из большой базы
    #38902138
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если порция получается великоватой - уменьшить интервал с суток до, скажем, пары часов.
Ну и наличие индекса по дате не повредит.
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902142
vlrewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Спасибо! Попробую!
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902143
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlrewer,

Возможно, было бы легче нужные данные скопировать в новую таблицу, а затем дропнуть целиком старую.
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902145
vlrewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Не совсем понял, как сделать индекс по дате?
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902147
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlrewerAkina, Не совсем понял, как сделать индекс по дате?А у вас его еще нет???
С индексом, вероятно, и исходный код заработает веселее.
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902148
vlrewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить...
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902151
vlrewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
подскажите, как его реализовать?
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902153
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlrewermiksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить...Думаю, не больше, чем такое порционное удаление. Кроме того, физически таблица получится куда более "плотная", что положительно скажется на ее дальнейшей жизни.
...
Рейтинг: 0 / 0
Удаление из большой базы
    #38902207
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и в дополнение к вышесказанному (если уж делать так делать), можно использовать PARTITION BY RANGE, в дальнейшем удалять более старые части ALTER TABLE Tabl DROP PARTITION p0;
...
Рейтинг: 0 / 0
Удаление из большой базы
    #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
Удаление из большой базы
    #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
Удаление из большой базы
    #38902334
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlrewer,

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

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

нет. Оно - это key `rec_date`
...
Рейтинг: 0 / 0
Удаление из большой базы
    #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
Удаление из большой базы
    #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
Удаление из большой базы
    #38902387
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
SET @date = @date + INTERVAL 1 DAY;



Это ты в оракле такого понахватался ?
Я далеко не уверен, что такое есть в MySQL.
...
Рейтинг: 0 / 0
Удаление из большой базы
    #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
Удаление из большой базы
    #38902529
vlrewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Тогда хорошо!)
...
Рейтинг: 0 / 0
Удаление из большой базы
    #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
Удаление из большой базы
    #38902705
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

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

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


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