|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
PizzaPizza строка у вас занимает 4000 байт, что для 5 миллионов строк будет чуть меньше 20 мегабайт ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 00:21 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
Akina, oh my! 20 (тысяч упустил) мегабайт это конечно 18 гигов. Мне надо больше спать. S_Gur, 18 гигов это много. Если мало памяти, то большие удаления из такой таблицы это боль обратно пропорциональная серверному железу. Если нельзя надолго блокировать таблицу, то удалять только кусками со всеми вытекающими накладными расходами. Это это будет долго. Если можно заблокировать таблицу, то удаление сквозняком будет быстрее, чем все "пачки" суммарно. Можно посчитать innodb_buffer_pool_size что бы меньше дергать диск при "пачковом" удалении. И тут посмотреть https://mariadb.com/kb/en/big-deletes/ У вас InnoDB, что значит ваши delete идут в лог - читай вы записываете все то, что удаляете в другой файл на случай отката транзакции. Грубо говоря, вы удаляете 1 гиг - вы записываете 1 гиг на время удаления. Это надо место и оперативка, что бы было быстрее . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 03:08 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
PizzaPizza У вас InnoDB, что значит ваши delete идут в лог - читай вы записываете все то, что удаляете в другой файл на случай отката транзакции. Грубо говоря, вы удаляете 1 гиг - вы записываете 1 гиг на время удаления. Это надо место и оперативка, что бы было быстрее . Вот-вот. Я это знаю. Поэтому и спрашивал, можно ли что-то сделать между каждой пачкой делитов. Была мысль выполнять построчно каждые 1000 записей в рамках одной транзакции, чтобы этот лог не разрастался. Но в итоге обошелся без этого, а вся эта дискуссия уже на перспективу ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 05:38 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
S_Gur Вы не ответили на мой вопрос: сколько времени займет выполнение хранимой процедуры, которая курсором обойдет 5 миллионов записей? По идее - вряд ли больше 10 секунд. Сервер должен быть при этом загружен на 100%. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 15:29 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, а ничего, что их перед этим надо получить? Из 5-миллионной таблицы, частями и по определенным условиям? Только запрос, по которому я получаю список записей основной таблицы, у которых количество записей в логе просто больше двух, выполняется секунды 2-3. Это около 16 000 записей. Потом я должен открыть курсор по этому набору данных и для каждой записи получить все записи в логе, которые надо обработать. Это второй курсор внутри первого, в некоторых случаях до 90 000 записей. Можно, конечно, из чисто спортивного интереса написать такую процедурку, но уж за минут 5 для достаточно оптимизированного сервера я ручаюсь. Причем - как очень правильно замечено - при этом сервер будет загружен полностью ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 17:59 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
S_Gur, "каждые 1000 записей в рамках одной транзакции, чтобы этот лог не разрастался" Это означает перестройку индексов несколько тысяч раз для ваших объёмов. Еще неизвестно что дешевле выйдет. на перспективу при больших удалениях проще делать зеркало копию таблицы и переносить туда insert-select то, что нужно, а потом грохать основную таблицу и переименовывать. Всяко меньше блокировок и логирования - меньше требования к железу. Все остальное это тюнинг и настройки, потенциально нарушающие работу всего сервера ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 18:45 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
в таблице есть дата, временные промежутки... можно подумать как нить партицировать. Судя по содержимому - это лучший выход как в рекомендациях #bigdata#mariadb ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 18:56 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
PizzaPizza, Естественно, это самый лучший выход - сделать новую таблицу и занести туда оставшиеся всего-то около 40 000 записей. Вот только проблемка: процедуры, которые к этой таблице обращаются, срабатывают в самом лучшем случае раз в секунду, а то и чаще. Решили не рисковать - во избежание проблем с клиентами. Я же говорил - проблема разовая, возникла из-за поздно выявленной ошибки в одной процедуре. Ошибка поправлена, таблицы почищены, лишние записи туда больше ге капают ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 20:20 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
Alex_Ustinov, это таблица, содержащая историю изменений. Предполагалось, что обращаться к ней будут редко, в случае возникновения проблем, да и размер ее планировался совсем другой. Поэтому никто не собирался ее как-то оптимизировать и уж тем более партицировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2021, 20:24 |
|
Ускорение удаления большого количества записей
|
|||
---|---|---|---|
#18+
S_Gur а ничего, что их перед этим надо получить? Из 5-миллионной таблицы, частями и по определенным условиям? Ничего, у хороших серверов дисковая выжимает два гигабайта в секунду. И для "получения из миллионной таблицы" именно она является узким местом. Десять секунд - как раз хватит на чтение Вашей двадцатигигабайтной базы целиком и полностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2021, 15:15 |
|
|
start [/forum/topic.php?fid=47&msg=40117878&tid=1827850]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 156ms |
0 / 0 |