MySQL «вставляет» разницу в скорости между рабочей и локальной средой слишком велика!

StackOverflow https://stackoverflow.com/questions/1078302

Вопрос

Я установил экземпляр MySQL 5.1x на машину Linux (768 МБ ОЗУ).Я восстановил резервную копию около 1000 строк и через свое .NET-приложение (развернутое на другом веб-сервере Windows) выполнил определенные операции чтения, которые, учитывая, что таблица не имела индексов, были быстрыми.

Затем я очистил сервер от этих строк и использовал функцию в своем веб-приложении на другом сервере для вставки строк (по сути, я читаю текст из текстового файла, вводя данные в поля пользовательского класса, а затем вызывая хранимую процедуру). с этими параметрами для каждой записи).Когда у меня на локальном компьютере были и веб-сайт, и база данных, я мгновенно вставлял 2500 строк (менее секунды).Однако теперь в «производственной» среде вставка тех же 2500 строк занимает 10 минут.Я использую файл my.cnf по умолчанию, который поставляется вместе с MySQL.

Есть ли способ оптимизировать запись без ущерба для скорости операций чтения?Или я упускаю что-то очевидное?

Заранее спасибо!

Это было полезно?

Решение

Вы посмотрели страница руководства MySQL для скорости вставки?Первое предположение, которое мне приходит на ум, заключается в том, что вы не заключаете набор из 2500 процедур в Начать транзакцию/фиксировать оператор, поэтому MySQL автоматически фиксирует каждое из 2500 действий.

Другие советы

В дополнение к проблеме, упомянутой Марком (автоматическая фиксация вместо транзакции), я бы определенно исследовал использование пакетных обновлений.Потому что одно из основных различий между локальным соединением и сетевым соединением (даже очень быстрым) — это время прохождения туда и обратно.

Хотя пропускная способность, скорее всего, не является ограничивающим фактором в этом случае, выполнение 2500 сетевых обращений к базе данных и обратно определенно займет намного больше времени в сети, чем на локальном компьютере.

Использование пакетного обновления может в идеале сократить количество вставок до одного, а на практике — до нескольких.

К сожалению, я не могу рассказать вам, как выполнять эти пакетные обновления в мире .NET, в Java вы бы использовали PreparedStatement.addBatch().Я уверен, что в .NET есть что-то подобное.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top