|
|
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Всем привет! Попросили помочь обслужить бд. Имеется база данных 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 Работает, но очень медленно и грустно. Порой данные быстрее добавляются, чем удаляются. Подскажите, как можно еще решить проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:21:20 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
А зачем такая процедура? Уж если удалять процедурой, растаскивая процесс по времени - то итерировать надо не по количеству, а по дате, начиная с заведомо более старой, чем у самой старой записи: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:39:12 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Если порция получается великоватой - уменьшить интервал с суток до, скажем, пары часов. Ну и наличие индекса по дате не повредит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:39:54 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо! Попробую! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:42:05 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewer, Возможно, было бы легче нужные данные скопировать в новую таблицу, а затем дропнуть целиком старую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:42:16 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, Не совсем понял, как сделать индекс по дате? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:42:33 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewerAkina, Не совсем понял, как сделать индекс по дате?А у вас его еще нет??? С индексом, вероятно, и исходный код заработает веселее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:44:26 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
miksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:44:32 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
miksoft, подскажите, как его реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:45:45 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewermiksoft, думал об этом, но нужных данных примерно 1,5 года, что в размере около 50 gb, даже не представляю сколько времени на Select и Insert надо убить...Думаю, не больше, чем такое порционное удаление. Кроме того, физически таблица получится куда более "плотная", что положительно скажется на ее дальнейшей жизни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 10:46:26 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
ну и в дополнение к вышесказанному (если уж делать так делать), можно использовать PARTITION BY RANGE, в дальнейшем удалять более старые части ALTER TABLE Tabl DROP PARTITION p0; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 11:38:57 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
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, и без него процедура бессмысленна и вредна. Без индекса по "дата" -- вообще самоубийство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 12:50:23 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
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, и без него процедура бессмысленна и вредна. Без индекса по "дата" -- вообще самоубийство. Всем спасибо за ответы! Осталось не ясным как проверить есть ли индексы в базе по дате или нет? т.к. база не моя.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 12:57:31 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewer, Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 12:58:32 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Key 'date_obj' оно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 13:05:43 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewer, нет. Оно - это key `rec_date` ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 13:27:02 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
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 Ругается на синтаксис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 13:27:47 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
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 должен быть ВНУТРИ цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 13:30:40 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. Это ты в оракле такого понахватался ? Я далеко не уверен, что такое есть в MySQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 13:31:40 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Так у кого-нить есть идея как правильно цикл задать? 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 14:44:21 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
tanglir, Тогда хорошо!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 14:57:24 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Блин, что у тебя с руками, а? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 15:39:18 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, тоже commit забыл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 16:24:20 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо большое, я ваш должник!) у меня заработал ваш вариант, когда в строке DELETE FROM `table` WHERE `date` = @date; моя таблица без кавычек и столбец без кавычек, т.е. DELETE FROM records WHERE rec_date = @date; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 16:27:35 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38902333&tid=1833434]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 383ms |

| 0 / 0 |
