|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Здравствуйте, Хочу попросить помощи, совета у Гуру MySql Я написал парсер большого источника данных. Источник парсится каждую минуту. Парсинг выполняется в 9 потоков. Результаты записываются в одну сводную таблицу. Таблица MyIsam Новые записи вставляются. Существующие записи обновляются. В сутки добавляется около 200 тыс. записей. За 3 дня таблица разрастается до около 700 тыс. записей Устаревшие записи (старше 3-х дней) переписываются в таблицу с историческими данными (для каждого дня отдельная таблица). Затем Устаревшие записи удаляются. Сохранение и удаление Устаревших записей производится по 200 записей каждую минуту. У меня периодически (примерно через неделю работы) ломается сводная таблица в базе данных. Как мне кажется это из-за удаления Устаревших записей. Я думаю что я почти все сделал неправильно :) Но как сделать правильно ? У меня такие варианты решения: 1) Разбить таблицу на несколько по суткам, по часам и использовать MERGE 2) Использование партиций 3) Попытаться избавиться от UPDATE (использовать только INSERT) 4) Использовать InnoDB 5) Использовать memcached Как Вы думаете какой самый правильный вариант ? Или какой вариант принесет наибольший выиграш ? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 18:53 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555, https://habr.com/ru/post/66151/ - логические данные те, по которым ваши данные становятся устаревшими. И вроде как все? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 18:59 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Устаревшие данные - все данные что были добавлены более 3-х дней назад. Если я правильно понял вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 19:04 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Озверинandrey-55555, https://habr.com/ru/post/66151/ - логические данные те, по которым ваши данные становятся устаревшими. И вроде как все? Что лучше Партиционирование или отдельные таблицы + MERGE ? Избавит ли Партиционирование от блокировок при одновременных UPDATE ? Мне кажется отдельные таблицы + MERGE лучше. Думаю попробовать таблицу с устаревшими данными переименовывать в таблицу с историческими данными. А для MERGE создавать новую таблицу. Или я не прав ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 19:21 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Модератор, было б неплохо кинуть в профильный форум по MySQL - там таки надают же советов. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 20:11 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555, партицирование может только усугубить ситуацию с блокировками. Мне не очень понятно, что там блокируется ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 20:12 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555Сохранение и удаление Устаревших записей производится по 200 записей каждую минуту. А вот например эта операция, как она делается - все 200 записей копируются и удаляются одной транзакцией, или каждая запись по отдельности? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2019, 23:48 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
myisam периодически падает от частых апдейтов с чем это связано не знаю aria engine будет надежней но его я встречал под mariadb ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2019, 15:13 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Всем спасибо, кто принял участие в обсуждении. Сейчас сделал так. Для сводной таблицы сделал партицирование Плюс Сделал семь таблиц для каждого дня недели. Данные пишу параллельно в общую сводную таблицу и в таблицу для дня недели. Для общей сводной таблицы удаляю устаревшие партиции (TURNICATE) Таблицы для дня недели переименовываю в исторические таблицы и создаю новые таблицы для соответствующего дня недели. Работает уже несколько дней. Все нормально. Для информации алгоритм с удалением по 200 записей выполнялся около 5 сек. Переименовывание таблиц и удаление устаревших партиций - выполняется доли секунды. --- В планах попробовать сделать так. Писать только в таблицы для дня недели и раз в пять минут собирать из них общую сводную таблицу. Плюсы: Работа с небольшими отельными таблицами. Для общей сводной таблицы будут только операции по чтению Не знаю на сколько быстро будет раз в пять минут собирать общую сводную таблицу размером в 1.1 Гига ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2019, 20:34 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555Здравствуйте, Я написал парсер большого источника данных. В сутки добавляется около 200 тыс. записей. За 3 дня таблица разрастается до около 700 тыс. записей Вы заблуждаетесь -у вас микроскопический объем данных ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2019, 21:52 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555Для информации алгоритм с удалением по 200 записей выполнялся около 5 сек. Переименовывание таблиц и удаление устаревших партиций - выполняется доли секунды. Я что то такое и подозревал. 5 секунд на 200 записей - это ОЧЕНЬ медленно. Цикл, в котором удаляется по одной записи? Это неправильная схема работы с базой данных. Если устаревшие данные легко отфильтровать (например, дата записи более чем на три дня старше текущего времени) - надо удалять не в цикле по одной, а с помощью sql delete. И не надо пытаться контролировать количество удаляемых записей. Даже если в какой то момент надо будет удалить несколько тысяч - это все равно будет работать намного быстрее, чем у вас сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2019, 07:45 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555, а вообще не удалять "старые" записи - никак? Все равно ведь храните их где-то рядом. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2019, 19:13 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555Устаревшие записи (старше 3-х дней) переписываются в таблицу с историческими данными (для каждого дня отдельная таблица). Затем Устаревшие записи удаляются. Сохранение и удаление Устаревших записей производится по 200 записей каждую минуту. У меня периодически (примерно через неделю работы) ломается сводная таблица в базе данных. Как мне кажется это из-за удаления Устаревших записей. Удаление как делаете? Если каждую минуту, как и парсинг (а вообще феерично если еще и во время парсинга), то это бред. Делайте раз в сутки и вас попустит. Ну и разбивать по 200 записей нет смысла - все лишнее удаляйте скопом в одной транзакции. Зачем для каждого дня своя таблица?.. Лично мне это не понять, хотя ХЗ как там у вас база и приложение построены. Но думаю что изначально неправильный подход к структуре таблиц. Если данные всеравно храните - смысл делать лишние телодвижения?.. Выше уже правильно сказали насчет этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 03:14 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Sergueiandrey-55555Здравствуйте, Я написал парсер большого источника данных. В сутки добавляется около 200 тыс. записей. За 3 дня таблица разрастается до около 700 тыс. записей Вы заблуждаетесь -у вас микроскопический объем данных ) Может быть. Я первый раз работаю с таким объемом ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 21:24 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
Отвечаю на предыдущие посты. Сохранять исторические данные нужно, поэтому: 1. Изначально решил, что хранить все в одной таблице - не правильно (хотя может я ошибаюсь), так как - если грохнется вся таблица - потеряются сразу все данные - таблица будет огромной (6 млн. записей в месяц). Думаю это будет сказываться на быстродействии. 2. Учитывая пункт 1 первоначально переписывал данные из "оперативной" таблицы (table_1) в историческую (table_2) при помощи: INSERT INTO table_2 SELECT * FROM table_1 потом сохраненные данные удалял одним запросом DELETE FROM table_1 Один раз попробовал сделать сразу для всех устаревших записей. Сервер завис. Правда это все я делал не останавливая парсинг. Может это моя основная ошибка ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 21:27 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-55555, Не надо ничего удалять. Быстродействие будет нормальным, просто разберись с индексами. Вообще, не нужно ранше времени заниматься оптимизацией. Если табличка "ломается" - ищи причину, или СУБД меняй, или оборудование, может быть - проблемы с условиями эксплуатации. 6 млн записей в месяц - это ерунда, даже ключи можно 32 битными оставить, хватит на 60 лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 22:56 |
|
парсер большого источника данных
|
|||
---|---|---|---|
#18+
andrey-555551. Изначально решил, что хранить все в одной таблице - не правильно (хотя может я ошибаюсь), так как - если грохнется вся таблица - потеряются сразу все данные - таблица будет огромной (6 млн. записей в месяц). Думаю это будет сказываться на быстродействии. 2. Учитывая пункт 1 первоначально переписывал данные из "оперативной" таблицы (table_1) в историческую (table_2) при помощи: INSERT INTO table_2 SELECT * FROM table_1 потом сохраненные данные удалял одним запросом DELETE FROM table_1 Один раз попробовал сделать сразу для всех устаревших записей. Сервер завис. Правда это все я делал не останавливая парсинг. Может это моя основная ошибка ? 1. Ошибаетесь. Все зависит от задачи. Бекапы придуманы не зря. А грохнуться может и по причине сбоя, от этого никто не застрахован. Это далеко не большая таблица. При правильно построенных индексах замедления не почувствуете. 2. Да, снова ошибка. Удаление это одна транзакция и в то же время у вас куча транзакций парсинга к этой же таблице. В итоге транзакции парсинга у вас вешают СУБД (это не проблема железа). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2019, 16:02 |
|
|
start [/forum/topic.php?fid=32&fpage=6&tid=1539965]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 259ms |
total: | 401ms |
0 / 0 |