Что лучше, по одной или несколько записей при INSERT?

Доброй ночи, прошу подсказать мне в решение вопроса.

Имеется система логов, которая довольно часто вызывается, при пиковых значениях достигает до 30-40 записей в секунду. Использую engine ARCHIVE, сервер MariaDB, подключение по unix сокету.

Имеет ли смысл собирать кучу данных допустим 50 записей и потом одним запросом добавлять 50 записей. Или же лучше оставить как есть и делать запись по одному.
  • Вопрос задан
  • 279 просмотров
Решения вопроса 2
@Akina
Сетевой и системный админ, SQL-программист.
Запись пакетом быстрее и менее нагрузочна, но выше вероятность потери при сбоях.

PS. 40 записей в секунду - это в общем-то ни о чём..
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Имеется система логов, которая довольно часто вызывается, при пиковых значениях достигает до 30-40 записей в секунду. Использую engine ARCHIVE, сервер MariaDB, подключение по unix сокету.

Имеет ли смысл собирать кучу данных допустим 50 записей и потом одним запросом добавлять 50 записей.

Смотри. Писание логов в Марию - это как по мне лишнее. Оверинжинеринг. В наше время логи собирают logstash-ем и пишут в Кибану. Там для каждого формата есть свой парсер. Для Ninx, Apache e.t.c.

Если тебе прям сильно-сильно надо писать логи в реляционную систему (очевидно что-то джойнить с логами) - то пиши максимально большой пачкой. Хоть 1000 штук. Сколько позволяет размер фрейма в этом unix socket. (Кстати какой он там?) А чорт его знает. Но.... если ты записал 999 записей а последняя еще не пришла, а тебе срочно нужно глядеть в базу - тогда делай периодически сброс по времени. Например через 3 секунды от начала пачки ты будешь делать insert независимо от того сколько строк накопил.

Вот так.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@EDIsaev
Проблема в том, что при ошибке ты теряешь весь пакет. т.е. можно писать и большими пакетами (и это и быстрее и к серверу меньше запросов, меньше загрузка), но обрабатывать исключения и при возникновении пробегать таки циклом и сохранять что проходит. если логи важные, что то, что не проходит, писать в отдельную таблицу ошибочных данных, на всякий случай
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы