2016-04-26 8 views
0

Существует два совета: 1. используйте php для чтения файла и вставки данных в базу данных; 2. Используйте инструкцию sql для «LOAD DATA INFILE», чтобы прочитать файл и вставить данные в базу данных. В результате, для наконечника требуется много времени, чтобы закончить работу, но два часового, для завершения нужно всего несколько секунд. Итак, вопрос в том, в чем разница между двумя советами? Речь идет о фундаментальном дизайне или теории теории php и sql? Если это так, то что это?Разница между php и sql?

+0

версия на РНР 5.3 и тип базы данных MySQL, и 5,5 версия , – James

ответ

0

Я нашел ответ на semiliar вопрос здесь: https://dba.stackexchange.com/questions/16809/why-is-load-data-infile-faster-than-normal-insert-statements

PHP операторы используют INSERT для добавления данных в базу данных, и использовать addential слои для подключения к базе данных. это латентность производства.

SQL INSERT без ускорения, что в php, потому что ему не нужны дополнительные уровни. и, наконец, в вопросе выше описывают, почему LOAD DATA INFILE быстрее, чем INSERT

+0

ok, thks.Я смотрю на это прямо сейчас. – James

0

Это зависит от того, как вы делаете версию PHP. Здесь у вас есть несколько вариантов с различными уровнями производительности.

Проходя через ОРМ как Doctrine или Propel даст вам много контроля над каждой записью и выставит дружественный интерфейс, но это самый медленным подход. Каждая запись обычно проверяется, поэтому у вас есть эта безопасность, но если данные уже известны - хорошо, есть лучшие способы.

Использование исходного адаптера базы данных, предоставляемого вашим ORM или с помощью чего-то вроде PDO, обычно выполняется быстрее, особенно если вы можете использовать подготовленные операторы и выполнять один и тот же оператор INSERT с разными значениями данных.

Самый эффективный способ, управляемый PHP, состоит в том, чтобы построить большой оператор INSERT с множеством наборов значений, так называемый «multi-insert», который обычно добавляет данные в куски 1000 или более строк за раз в зависимости от того, как большой каждый ряд. При правильной настройке сервера производительность этого может приблизиться к оптимальному, где вы можете заплатить штраф в размере 30-50% против максимально возможного теоретического. Иногда это разумный компромисс.

Подход LOAD DATA INFILE всегда будет самым быстрым, поскольку MySQL имеет ряд внутренних оптимизаций для его обработки. Это требует от вас наличия файла непосредственно на сервере базы данных в формате, который он может читать, поэтому он также является самым ограниченным. Вы также несете ответственность за то, чтобы данные были правильными и соответствовали вашей схеме, или может произойти непреднамеренное усечение. Проверка данных не выполняется, и недопустимые даты могут закончиться такими вещами, как 0000-00-00, что может вызвать проблемы.

Таким образом, все эти подходы действительны в зависимости от обстоятельств. Если вам нужна скорость, то подход LOAD DATA всегда будет самым быстрым, но это не без риска.

Удаление PHP из уравнения уменьшает накладные расходы. Использование файла на диске позволяет избежать накладных расходов сетевого стека и сетевого протокола MySQL. Эти два имеют довольно низкие затраты на все рассмотренные вещи, но они важны для запоминания, особенно когда вы пытаетесь вставить гигантские объемы данных в систему, которая оборудована для работы очень быстро.

+0

версия php равна 5.3. – James

+0

Вы имеете в виду, что php проверяет каждое утверждение? – James

+0

ORM будет делать такие вещи, как проверка, что имя заполнено, или пароль имеет число в нем, что может быть важно при работе с грязными данными. Низкоуровневый PHP не будет делать много валидации, но он должен будет сделать некоторую кодировку и ускользнуть. Из файла он идет почти сырым, очень мало обрабатывается. – tadman

1

В первом методе PHP-код будет проверять каждое значение, которое он будет вставлять (i.e) проверит, является ли это чистым номером, если он будет вставлять числовое значение (зависит от логики программирования в используемом скрипте)

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

Php будет ждать каждого вставить инструкцию, отправленную на сервер базы данных (если это ваш алгоритм вставки). И это Сервер приложений до Сервер базы данных до Сервер приложений логика, которая добавляет еще несколько латентностей.

В случае БД сервера это просто количество вставок ничего более, он должен быть быстрее, чем PHP

+0

Несмотря на то, что замечание о проверке не всегда правильно, многие PHP-программы просто убегают и запускают его по кабелю независимо от того, чтобы MySQL разбирался, наблюдение за задержкой действительно очень важно здесь. – tadman

+0

Как я уже сказал, все зависит от логики проектирования php-скрипта, кроме того, сервер приложений для сервера db для приложений-приложений добавляет некоторые из них на вставку php –

+0

. Причина в том, что php необходимо подключиться к базе данных и создать каждый отдельный поток для каждого отдельного оператора вставки? Но когда я присоединяюсь к инструкции insert вместе, все равно нужно много времени, чтобы исправить. – James

 Смежные вопросы

  • Нет связанных вопросов^_^