Я хочу вставить около 50 000 запросов mysql для 'insert' в mysql db, для этого у меня есть 2 варианта,
1- Непосредственно импортируйте файл (.sql). Произошла ошибка: «Вероятно, вы пытались загрузить слишком большой файл. Пожалуйста, обратитесь к документации о способах устранения этого ограничения».
2- Используйте PHP-код для вставки этих запросов в виде разных фрагментов из файла (.sql). вот мой код:
<?php // Configure DB include "config.php"; // Get file data $file = file('country.txt'); // Set pointers & position variables $position = 0; $eof = 0; while ($eof < sizeof($file)) { for ($i = $position; $i < ($position + 2); $i++) { if ($i < sizeof($file)) { $flag = mysql_query($file[$i]); if (isset($flag)) { echo "Insert Successfully<br />"; $position++; } else { echo mysql_error() . "<br>\n"; } } else { echo "<br />End of File"; break; } } $eof++; } ?>
Но ошибка размера памяти возникает, однако у меня есть ограничение на максимальную память от 128M до 256M или даже 512M.
Тогда я думаю, что если я смогу загрузить ограниченные строки из (.sql) файлов, например 1000, и выполнить запрос mysql, тогда он может импортировать все записи из файла в db. Но здесь я понятия не имею, как обрабатывать местоположение начала файла до конца и как я могу обновить начальное и конечное местоположение, чтобы он не извлекал ранее извлеченные строки из файла .sql.
Вот код, который вам нужен, теперь приглушен ! = D
<?php include('config.php'); $file = @fopen('country.txt', 'r'); if ($file) { while (!feof($file)) { $line = trim(fgets($file)); $flag = mysql_query($line); if (isset($flag)) { echo 'Insert Successfully<br />'; } else { echo mysql_error() . '<br/>'; } flush(); } fclose($file); } echo '<br />End of File'; ?>
в<?php include('config.php'); $file = @fopen('country.txt', 'r'); if ($file) { while (!feof($file)) { $line = trim(fgets($file)); $flag = mysql_query($line); if (isset($flag)) { echo 'Insert Successfully<br />'; } else { echo mysql_error() . '<br/>'; } flush(); } fclose($file); } echo '<br />End of File'; ?>
В основном это менее жадная версия вашего кода, вместо того, чтобы вскрыть весь файл в памяти, он читает и выполняет небольшие куски (один лайнер) операторов SQL.
Вместо того, чтобы загружать весь файл в память, что и было сделано при использовании файловой функции, возможным решением было бы прочитать его по очереди, используя комбинацию fopen
, fgets
и fclose
– идея состоит в том, чтобы читать только то, что вам нужно иметь дело с линиями, которые у вас есть, и только после этого прочитайте следующую пару.
В дополнение, вы можете взглянуть на этот ответ: Лучшая практика: Импортировать файл mySQL в PHP; разделенные запросы
Пока нет ответа, но некоторые из этих ответов уже могут помочь вам …
Используйте клиент командной строки, он намного эффективнее и должен легко обрабатывать вставки 50K:
mysql -uUser -p <db_name> < dump.sql
Недавно я прочитал о том, как быстро вставлять много запросов в базу данных. В статье предлагается использовать функцию sleep () (или usleep ) для задержки нескольких секунд между запросами, чтобы не перегружать сервер MySQL.