powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / парсер большого источника данных
17 сообщений из 17, страница 1 из 1
парсер большого источника данных
    #39763797
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

Хочу попросить помощи, совета у Гуру MySql

Я написал парсер большого источника данных.

Источник парсится каждую минуту.
Парсинг выполняется в 9 потоков.

Результаты записываются в одну сводную таблицу.
Таблица MyIsam
Новые записи вставляются.
Существующие записи обновляются.

В сутки добавляется около 200 тыс. записей.
За 3 дня таблица разрастается до около 700 тыс. записей

Устаревшие записи (старше 3-х дней) переписываются в таблицу с историческими данными
(для каждого дня отдельная таблица).
Затем Устаревшие записи удаляются.
Сохранение и удаление Устаревших записей производится по 200 записей каждую минуту.

У меня периодически (примерно через неделю работы) ломается сводная таблица в базе данных.
Как мне кажется это из-за удаления Устаревших записей.


Я думаю что я почти все сделал неправильно :)

Но как сделать правильно ?

У меня такие варианты решения:
1) Разбить таблицу на несколько по суткам, по часам и использовать MERGE
2) Использование партиций
3) Попытаться избавиться от UPDATE (использовать только INSERT)
4) Использовать InnoDB
5) Использовать memcached

Как Вы думаете какой самый правильный вариант ?
Или какой вариант принесет наибольший выиграш ?

Спасибо.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39763800
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555,



https://habr.com/ru/post/66151/ - логические данные те, по которым ваши данные становятся устаревшими. И вроде как все?
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39763802
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Устаревшие данные - все данные что были добавлены более 3-х дней назад.
Если я правильно понял вопрос.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39763809
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверинandrey-55555,



https://habr.com/ru/post/66151/ - логические данные те, по которым ваши данные становятся устаревшими. И вроде как все?

Что лучше Партиционирование или отдельные таблицы + MERGE ?
Избавит ли Партиционирование от блокировок при одновременных UPDATE ?

Мне кажется отдельные таблицы + MERGE лучше.
Думаю попробовать таблицу с устаревшими данными переименовывать в таблицу с историческими данными.
А для MERGE создавать новую таблицу.

Или я не прав ?
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39763820
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор, было б неплохо кинуть в профильный форум по MySQL - там таки надают же советов.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39763821
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555, партицирование может только усугубить ситуацию с блокировками.
Мне не очень понятно, что там блокируется ?
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39763867
s_ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555Сохранение и удаление Устаревших записей производится по 200 записей каждую минуту.

А вот например эта операция, как она делается - все 200 записей копируются и удаляются одной транзакцией, или каждая запись по отдельности?
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39764393
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myisam периодически падает
от частых апдейтов
с чем это связано не знаю
aria engine будет надежней
но его я встречал под mariadb
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39767307
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, кто принял участие в обсуждении.

Сейчас сделал так.

Для сводной таблицы сделал партицирование
Плюс
Сделал семь таблиц для каждого дня недели.

Данные пишу параллельно в общую сводную таблицу и в таблицу для дня недели.

Для общей сводной таблицы удаляю устаревшие партиции (TURNICATE)
Таблицы для дня недели переименовываю в исторические таблицы и создаю новые таблицы для соответствующего дня недели.

Работает уже несколько дней.
Все нормально.

Для информации алгоритм с удалением по 200 записей выполнялся около 5 сек.
Переименовывание таблиц и удаление устаревших партиций - выполняется доли секунды.



---
В планах попробовать сделать так.
Писать только в таблицы для дня недели и раз в пять минут собирать из них общую сводную таблицу.

Плюсы:
Работа с небольшими отельными таблицами.
Для общей сводной таблицы будут только операции по чтению


Не знаю на сколько быстро будет раз в пять минут собирать общую сводную таблицу размером в 1.1 Гига
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39767328
Serguei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555Здравствуйте,
Я написал парсер большого источника данных.

В сутки добавляется около 200 тыс. записей.
За 3 дня таблица разрастается до около 700 тыс. записей


Вы заблуждаетесь -у вас микроскопический объем данных )
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39767378
s_ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555Для информации алгоритм с удалением по 200 записей выполнялся около 5 сек.
Переименовывание таблиц и удаление устаревших партиций - выполняется доли секунды.

Я что то такое и подозревал. 5 секунд на 200 записей - это ОЧЕНЬ медленно.
Цикл, в котором удаляется по одной записи?
Это неправильная схема работы с базой данных.
Если устаревшие данные легко отфильтровать (например, дата записи более чем на три дня старше текущего времени) - надо удалять не в цикле по одной, а с помощью sql delete. И не надо пытаться контролировать количество удаляемых записей. Даже если в какой то момент надо будет удалить несколько тысяч - это все равно будет работать намного быстрее, чем у вас сейчас.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39767795
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555,

а вообще не удалять "старые" записи - никак? Все равно ведь храните их где-то рядом.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39767857
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555Устаревшие записи (старше 3-х дней) переписываются в таблицу с историческими данными
(для каждого дня отдельная таблица).
Затем Устаревшие записи удаляются.
Сохранение и удаление Устаревших записей производится по 200 записей каждую минуту.

У меня периодически (примерно через неделю работы) ломается сводная таблица в базе данных.
Как мне кажется это из-за удаления Устаревших записей.

Удаление как делаете? Если каждую минуту, как и парсинг (а вообще феерично если еще и во время парсинга), то это бред. Делайте раз в сутки и вас попустит. Ну и разбивать по 200 записей нет смысла - все лишнее удаляйте скопом в одной транзакции.
Зачем для каждого дня своя таблица?.. Лично мне это не понять, хотя ХЗ как там у вас база и приложение построены. Но думаю что изначально неправильный подход к структуре таблиц. Если данные всеравно храните - смысл делать лишние телодвижения?.. Выше уже правильно сказали насчет этого.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39768525
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergueiandrey-55555Здравствуйте,
Я написал парсер большого источника данных.

В сутки добавляется около 200 тыс. записей.
За 3 дня таблица разрастается до около 700 тыс. записей


Вы заблуждаетесь -у вас микроскопический объем данных )

Может быть.
Я первый раз работаю с таким объемом
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39768526
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отвечаю на предыдущие посты.

Сохранять исторические данные нужно, поэтому:

1.
Изначально решил, что хранить все в одной таблице - не правильно (хотя может я ошибаюсь), так как
- если грохнется вся таблица - потеряются сразу все данные
- таблица будет огромной (6 млн. записей в месяц). Думаю это будет сказываться на быстродействии.

2.
Учитывая пункт 1 первоначально переписывал данные из "оперативной" таблицы (table_1) в историческую (table_2)
при помощи:
INSERT INTO table_2 SELECT * FROM table_1

потом сохраненные данные удалял одним запросом
DELETE FROM table_1

Один раз попробовал сделать сразу для всех устаревших записей.
Сервер завис.

Правда это все я делал не останавливая парсинг.
Может это моя основная ошибка ?
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39768555
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555,

Не надо ничего удалять. Быстродействие будет нормальным, просто разберись с индексами.
Вообще, не нужно ранше времени заниматься оптимизацией.
Если табличка "ломается" - ищи причину, или СУБД меняй, или оборудование, может быть - проблемы с условиями эксплуатации.
6 млн записей в месяц - это ерунда, даже ключи можно 32 битными оставить, хватит на 60 лет.
...
Рейтинг: 0 / 0
парсер большого источника данных
    #39768692
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-555551.
Изначально решил, что хранить все в одной таблице - не правильно (хотя может я ошибаюсь), так как
- если грохнется вся таблица - потеряются сразу все данные
- таблица будет огромной (6 млн. записей в месяц). Думаю это будет сказываться на быстродействии.

2.
Учитывая пункт 1 первоначально переписывал данные из "оперативной" таблицы (table_1) в историческую (table_2)
при помощи:
INSERT INTO table_2 SELECT * FROM table_1

потом сохраненные данные удалял одним запросом
DELETE FROM table_1

Один раз попробовал сделать сразу для всех устаревших записей.
Сервер завис.

Правда это все я делал не останавливая парсинг.
Может это моя основная ошибка ?
1. Ошибаетесь. Все зависит от задачи.
Бекапы придуманы не зря. А грохнуться может и по причине сбоя, от этого никто не застрахован.
Это далеко не большая таблица. При правильно построенных индексах замедления не почувствуете.
2. Да, снова ошибка. Удаление это одна транзакция и в то же время у вас куча транзакций парсинга к этой же таблице. В итоге транзакции парсинга у вас вешают СУБД (это не проблема железа).
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / парсер большого источника данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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