|
|
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
MasterZivcommit забылА нафига он тут? у меня и транзакции-то нету, так что результат выполнения каждого DELETE сразу и коммиттится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 16:34:08 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewerмоя таблица без кавычек и столбец без кавычек, т.е. DELETE FROM records WHERE rec_date = @date; Если кавычки вызывали проблему, и не было лишних или нехватающих, то вывод однозначный - были НЕ ТЕ кавычки, какие надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 16:36:37 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
AkinaMasterZivcommit забылА нафига он тут? у меня и транзакции-то нету, так что результат выполнения каждого DELETE сразу и коммиттится. Код: sql 1. 2. я опять все сломал(. Что с комитом, что без перестал работать, вроде пишет affected 0, но строки остаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:04:58 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, Да, Вы правы. Такой код тоже сработал Код: sql 1. 2. 3. 4. 5. 6. 7. Но строки опять не удалил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:11:30 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
AkinaMasterZivcommit забылА нафига он тут? у меня и транзакции-то нету, так что результат выполнения каждого DELETE сразу и коммиттится. Объясни тогда, зачем вообще весь этот гемор с процедурой и циклом, если не для оптимизации транзакций ? Без оптимизации транзакций можно и одним запросом всё, что надо удалить. Быстрее будет (правда, возможно не закончится успешно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:17:25 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
MasterZivAkinaпропущено... А нафига он тут? у меня и транзакции-то нету, так что результат выполнения каждого DELETE сразу и коммиттится. Объясни тогда, зачем вообще весь этот гемор с процедурой и циклом, если не для оптимизации транзакций ? Без оптимизации транзакций можно и одним запросом всё, что надо удалить. Быстрее будет (правда, возможно не закончится успешно). А, сори, тут я уже стормозил. Там же каждый оператор много записей удаляет. Извините, не догнал, тогда всё ок, commit не нужен (при включённом autocommit). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:19:42 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
MasterZivОбъясни тогда, зачем вообще весь этот гемор с процедурой и циклом, если не для оптимизации транзакций ?Это к ТС вопрос. Где он там про транзакции-то говорил? что-то я такого за ним не припоминаю... MasterZivБез оптимизации транзакций можно и одним запросом всё, что надо удалить. Ну или отправить сервер в кому. И после восстановления обнаружить малоосмысленные ошмётки базы. А что, вариант, нет данных - нет проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:23:36 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
vlrewerТакой код тоже сработал [skipped] Но строки опять не удалил. Вы уж не поленитесь ПОЛНОСТЬЮ показать процедуру. Хрен знает, что там выше-ниже. А ещё лучше прямо процитируйте с консоли подряд выполненные SHOW CREATE PROCEDURE - SELECT COUNT(*) - CALL - SELECT COUNT(*). Ну чтобы видать было, что оно и как. И да - DISPLAY WARNINGS включите, мало ли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 17:28:09 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
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. 52. 53. 54. 55. 56. 57. 58. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 20:29:45 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, с правильными ковычками и без commit. разницы нет. Код: 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. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 20:51:56 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
А что показывает Код: sql 1. 2. 3. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2015, 22:44:34 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, Прошу прощения за долгий ответ, доступа к базе не было. Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2015, 09:21:23 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, И еще заметил такую странность, если создать новую процедуру с другими датами, которые не старше этих, запрос на удаление якобы выполняется, пишет время выполнения 40 сек, но при проверки все остаться на месте. А если еще раз вызвать процедуру, то уже время выполнения 0 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2015, 09:14:46 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Простите за дурацкий вопрос... а у Вас поле REC_DATE какой имеет тип? небось с секундочками... а Вы его сравниваете с датой без секунд... А что второй раз быстрее - так это понятно, кэш работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2015, 09:51:10 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Так что в процедуре просто замените запрос на удаление на Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2015, 09:52:55 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2015, 10:03:52 |
|
||
|
Удаление из большой базы
|
|||
|---|---|---|---|
|
#18+
Akina, Ура! Код: sql 1. сработал! Удаляет, отпишусь по окончании) Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2015, 10:09:21 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1833434]: |
0ms |
get settings: |
13ms |
get forum list: |
25ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 436ms |

| 0 / 0 |
