Очень медленные красноречивые запросы вставки / обновления в Laravel
У меня есть приложение Laravel, которое должно insert/update
тысячи записей в секунду в цикле for. моя проблема в том, что моя база данных insert/update
скорость записи 100-150 в секунду. Я увеличил объем оперативной памяти, выделенной для моей базы данных, но мне не повезло.
Есть ли способ увеличить скорость записи для My SQL до тысячи записей в секунду?
пожалуйста, предоставьте мне оптимальные конфигурации для настройки производительности
и ПОЖАЛУЙСТА, не ставьте отметку вниз. мой код правильный. Это не проблема кода, потому что у меня нет проблем с MONGODB. но я должен использовать My SQL.
Мой механизм хранения InnoDB
2 ответа
Вставка строк по одному и автоматическая фиксация каждого оператора имеют два накладных расхода.
Каждая транзакция имеет накладные расходы, возможно, более одной вставки. Поэтому вставка нескольких строк в одну транзакцию - хитрость. Это требует изменения кода, а не изменения конфигурации.
каждый INSERT
Заявление имеет накладные расходы. Одна вставка имеет около 90% надстройки и 10% фактической вставки.
Оптимальным является 100-1000 строк, вставляемых за транзакцию.
Для быстрых вставок:
- Лучше всего
LOAD DATA
- если вы начинаете с файла.csv. Если вам сначала нужно создать файл.csv, то остается спорным, что эти издержки приводят к потере этого подхода. - Второй лучший - многорядный
INSERT
заявления:INSERT INTO t (a,b) VALUES (1,2), (2,3), (44,55), ...
, Я рекомендую 1000 за утверждение, иCOMMIT
каждое утверждение. Это может привести к тому, что вы вставите более 1000 строк в секунду.
Другая проблема... Поскольку каждый индекс обновляется по мере вставки строки, вы можете столкнуться с проблемой перебоя ввода-вывода для выполнения этой задачи. InnoDB автоматически "задерживает" обновления неуникальных вторичных индексов (нет необходимости в INSERT DELAYED
), но работа в итоге сделана. (Так размер оперативки и innodb_buffer_pool_size
вступают в игру.)
Если "тысячи" строк в секунду - одноразовая задача, вы можете перестать читать здесь. Если вы ожидаете, что будете делать это постоянно "навсегда", есть и другие проблемы, с которыми приходится сталкиваться. См. Прием пищи на высокой скорости.
Для вставки, вы можете посмотреть в INSERT DELAYED
синтаксис. Это увеличит производительность вставки, но это не поможет с обновлением, и синтаксис в конечном итоге будет устаревшим. Этот пост предлагает альтернативу для обновлений, но он включает в себя пользовательскую репликацию.
Один из способов ускорить вставку моей компании - записать SQL в файл, а затем использовать MySQL. LOAD DATA INFILE
команда, но я считаю, что мы обнаружили, что требуется, чтобы командная строка сервера имела mysql
приложение установлено.
Я также обнаружил, что вставка и обновление в пакете часто происходит быстрее. Так что если вы звоните INSERT
2k раз, возможно, лучше запустить 10 вставок по 200 строк в каждой. Это уменьшит требования к блокировке и уменьшит информацию / количество вызовов, отправляемых по проводам.