Как быстро добавлять / обновлять миллионы строк в БД Laravel?
Здравствуйте. Возникла небольшая проблемка, вот ищу пути её решения.
Проект поделён как бы на 2 части. Первая часть - это API, который крутится на отдельном сервере, а вторая - пользовательская часть. Базы тоже две.
На сервер с API буквально каждую минуту приходят десятки тысяч новые строк, которые нужно заносить в БД. Мы используем для этого "очереди". Но скорость не устраивает(. Хотя подняли уже 10 воркеров. Таблица "jobs" просто не вывозит такой приток новых данных и постоянно растёт, что соответственно даёт большую нагрузку на сервер.
Вот как быть? Как менее затратно по ресурсам обновлять миллионы строк в БД ? И подходят ли вообще для этого очереди?
Во первых, записывать и обновлять данные можно пачками, во-вторых, возможно для этого выбрана неверная база. Выглядит как аналитические данные (клики, посещения страниц). Для этого лучше будет использовать базу созданную для массовой обработки данных, например, кликхаус
Для сферического обновления в вакууме не нужно вообще ничего.
БД спокойно по умолчанию пишет десятки тысяч строк в секунду.
То есть просто записывать и всё.
При возникновении конкретных проблем надо собраться с мыслями и задать конкретный вопрос, детально описывая проблему. А не вот это вот "ну у нас там много всего и растёт нагрузка".
В качестве чисто гадательной рекомендации поиграться с innodb_flush_log_at_trx_commit / транзакции.
Вопрос не как добавляешь, а как потом эти данные читаешь, как ведёшь выборку.
Например (один из многих вариантов не ответ на твой) не добавляя индексы можно очень сильно понять скорость, но для чтения либо создать либо переносить большими блоками в другую таблицу, попутно агрегируя,
Заведи патриции например по времени, если характер данных - временные ряды
Мало входных данных. Все что можно сделать с минимальными телодвижениями:
1. Очередь перевести на redis
2. С помощью очереди можете накопить данные, а потом забрать с нее пачкой и записать в базу