Я создаю веб-приложение php, которое позволяет пользователю загружать базу данных MS Access (csv export), которая затем переводится и переносится в базу данных MySQL.
База данных MS Access состоит из одной таблицы t_product из 100 тыс. Строк. Эта таблица не разработана хорошо. В качестве примера приведем следующий запрос:
SELECT part_number, model_number FROM t_product
вернет:
part_number model_number
100 AX1000, AX1001, AX1002
101 CZ10, CZ220, MB100
Как видите, номера моделей указаны в виде значений, разделенных запятыми, а не отдельных записей в другой таблице. Есть еще много вопросов такого рода. Я пишу скрипт для очистки этих данных перед импортом в базу данных MySQL. Сценарий также отобразит существующие столбцы Access в соответствующую базу данных реляционного проектирования.
Моя проблема в том, что мой сценарий выполняется слишком долго. Вот упрощенный код, объясняющий, что я делаю:
$handle = fopen("MSAccess.csv, "r");
// get each row from the csv
while ($data=fgetcsv($handle, 1000, ","))
{
mysql_query("INSERT INTO t_product (col1, col2 etc...) values ($data[0], $data[1], etc...");
$prodId = mysql_last_insert_id();
// using model as an example, there are other columns
// with csv values that need to be broken up
$arrModel = explode(',', $data[2]);
foreach($arrModel as $modelNumber)
mysql_query("INSERT INTO t_model (product_id, col1, col2 etc...) values ($prodId, $modelNumber[0], $modelNumber[1] etc...");
}
Проблема здесь в том, что каждая итерация цикла while делает огромное количество обращений к базе данных. Для каждой записи о продукте я должен указать N номеров моделей, Y номеров деталей, X серийных номеров и т. Д.
Я начал другой подход, где я сохранил весь CSV в массиве. Затем я пишу один пакетный запрос, как
$sql = "INSERT INTO t_product (col1, col2, etc...) values ";
foreach($arrParam as $val)
$sql .= " ($val[0], $val[1], $val[2]), "
Но я столкнулся с чрезмерными ошибками памяти при таком подходе. Я увеличил максимальный лимит памяти до 64M, и у меня все еще не хватает памяти.
Как лучше всего решить эту проблему?
Может быть, я должен сначала записать все свои запросы в файл * .sql, а затем импортировать файл * .sql в базу данных mysql?