SiZE
Новичок
Помогите оптимизировать добавление данных
Есть задача внести из XML файла данные в MySQL.
Условия: внести все полученные данные, предварительно проверив на уникальность.
XML обрабатываю через PHP, функцией simplexml_load_file(). Далее формирую массив. Получается порядка 100 000 — 300 000 записей для вставки. Раньше данных было мало, порядка 1000 - 3000 записей. И поэтому достаточно было обойти циклом массив. Сделать для каждой записи SELECT COUNT(id)... с условием проверки на уникальность и в зависимости от результат сделать INSERT или UPDATE.
С увеличением количества записей ситуация координально поменялась при такой вставке данных скрипт начинает жрать от 100 метров до гига и выше. А таких файлов несколько тысяч и сервак вообщем не выдерживает нагрузки.
В кратце код такой:
1. Были мысли создать файл CSV и выгрузить данные в базу, тогда я не знаю как проверить на уникальность записи.
2. Или выгрузить в файл CSV и загрузить во временную таблицу, дубликаты удалить а таблицы слить. Но особо пока не представляю, как слить таблицы.
3. Или пройтись по всему массиву выпонить для каждой записи SELECT COUNT(id) ... удалить из массива дубликаты, на лету создать INSERT INTO table VALUES (1,2,3), (4,5,6), (7,8,9),..., n и загрузить. Не знаю как только MySQL отреагирует если количество VALUES будет порядка 100 000 — 300 000.
Мб что то еще?
Есть задача внести из XML файла данные в MySQL.
Условия: внести все полученные данные, предварительно проверив на уникальность.
XML обрабатываю через PHP, функцией simplexml_load_file(). Далее формирую массив. Получается порядка 100 000 — 300 000 записей для вставки. Раньше данных было мало, порядка 1000 - 3000 записей. И поэтому достаточно было обойти циклом массив. Сделать для каждой записи SELECT COUNT(id)... с условием проверки на уникальность и в зависимости от результат сделать INSERT или UPDATE.
С увеличением количества записей ситуация координально поменялась при такой вставке данных скрипт начинает жрать от 100 метров до гига и выше. А таких файлов несколько тысяч и сервак вообщем не выдерживает нагрузки.
В кратце код такой:
PHP:
<?
$xml = simplexml_load_file (file.xml);
newArr = array ();
foreach ($xml as $v) {
$newArr['field1'] = $v['field1'];
$newArr['field2'] = $v['field2'];
$newArr['field3'] = $v['field3'];
}
foreach ($newArr as $k => $v) {
$sql = "INSERT INTO table2 SET field1='$v['field1']'";
$db->exec ($sql);
$link = $db->insert_id(); // mysql_insert_id();
$sql = "SELECT COUNT(id), id FROM table1 WHERE field1='$v['field1']' AND field2='$v['field2']' LIMIT 1";
$res = $db->exec ($sql);
if ($res) {
$sql = "INSERT INTO table1 SET field1='$v['field1']', field2='$v['field2']', field3='$v['field3']', field4='$link'";
$db->exec ($sql);
} else {
$sql = "UPDATE table1 SET field3='$v['field3']' WHERE id='$res['id']'";
$db->exec ($sql);
}
}
?>
2. Или выгрузить в файл CSV и загрузить во временную таблицу, дубликаты удалить а таблицы слить. Но особо пока не представляю, как слить таблицы.
3. Или пройтись по всему массиву выпонить для каждой записи SELECT COUNT(id) ... удалить из массива дубликаты, на лету создать INSERT INTO table VALUES (1,2,3), (4,5,6), (7,8,9),..., n и загрузить. Не знаю как только MySQL отреагирует если количество VALUES будет порядка 100 000 — 300 000.
Мб что то еще?