Как вставить/обновить большой объем данных в mysql с помощью php

У меня есть лист excel с большим объемом данных. Я использую php для вставки данных на сервер mysql.

у меня две проблемы

1) Мне нужно обновить строку, если идентификатор уже существует, иначе вставьте данные.

2) БОЛЬШАЯ ПРОБЛЕМА: у меня более 40 000 строк, а время ожидания на сервере sql, установленное администратором, составляет 60 секунд. Когда я запускаю запрос на обновление/вставку, это займет более 60 секунд, и из-за этого будет тайм-аут. Таким образом, весь процесс будет провален.

Есть ли способ сделать это?

В настоящее время я проверяю идентификатор студента, если он существует, затем обновляю, иначе вставляю. Я чувствую, что это занимает много времени и приводит к тайм-ауту сервера.

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

Поможет ли это в любом случае?

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


person Advait    schedule 09.05.2014    source источник
comment
вы можете запустить то же самое из командной строки, поскольку сценарии командной строки не имеют тайм-аута, если процесс не завершится или вы не уничтожите его. Взгляните на http://www.php.net/manual/en/function.set-time-limit.php   -  person shatheesh    schedule 09.05.2014
comment
Я не могу этого сделать, так как я делаю это для клиента и даю ему функциональность на стороне браузера. И его сервер контролируется командой администраторов, которые не могут этого изменить.   -  person Advait    schedule 09.05.2014
comment
Используйте вставку ... для стратегии дублирования ключей, как описано выше. И динамически измените максимальное время выполнения php ini_set('max_execution_time','20M');   -  person Ulrich Horus    schedule 09.05.2014


Ответы (1)


Предполагая, что вы используете движок InnoDB (который используется по умолчанию в самых последних версиях MySQL), вы должны просто использовать транзакции: оберните цикл вставки в BEGIN; ... СОВЕРШИТЬ; блокировать.

По умолчанию каждый оператор выполняется как транзакция, и сервер должен убедиться, что данные безопасно переносятся на диск, прежде чем переходить к следующему оператору. Если вы начинаете транзакцию, затем делаете много вставок, а затем фиксируете транзакцию, только тогда сервер должен сбросить все данные на диск. На современном оборудовании это может составлять всего несколько дисковых операций вместо 500 тысяч. Еще одним соображением является использование подготовленных операторов. Сервер должен анализировать каждый оператор SQL перед его выполнением. Этот синтаксический анализ не является бесплатным, и нет ничего необычного в том, что время синтаксического анализа может быть дороже, чем фактическое время выполнения запроса. Обычно этот разбор выполняется каждый раз, а в вашем случае это делается 500 тысяч раз. Если вы используете подготовленные операторы, синтаксический анализ/подготовка выполняется только один раз, а стоимость выполнения оператора — это только запись на диск (что дополнительно улучшается, если вы находитесь в активной транзакции, поскольку сервер может пакетировать эту запись, откладывая ее до тех пор, пока транзакция не будет зафиксирована).

Общее улучшение от использования этих методов может быть значительным — я видел ситуации, когда использование транзакций сокращало общее время выполнения с 30 минут до 20 секунд.

http://php.net/manual/en/pdo.prepared-statements.php

person rajppari    schedule 09.05.2014
comment
Можете ли вы дать мне пример (код), как я могу сделать это с помощью php. Начать и совершить, я имею в виду. Поскольку я получаю значения из файла excel, могу ли я использовать подготовленные операторы? Пожалуйста, покажите несколько примеров. - person Advait; 09.05.2014
comment
пример ниже Ссылка in1.php.net/pdo.prepared-statements mysqltutorial.org/mysql-prepared-statement.aspx - person rajppari; 09.05.2014