Очень медленные красноречивые запросы вставки / обновления в 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 строк в каждой. Это уменьшит требования к блокировке и уменьшит информацию / количество вызовов, отправляемых по проводам.

Другие вопросы по тегам