Массовый импорт / обновление данных в базу данных - PullRequest
1 голос
/ 08 июня 2011

У меня большой XML-документ (~ 10 МБ), который содержит данные.Мне нужно проанализировать этот XML и просмотреть мою базу данных, чтобы обновить его.Существует 3 случая:

  • Новые данные присутствуют в XML с прошлого раза - вставьте их в БД
  • Элемент изменился - обновите его в БД
  • Элемент был удален из XML с прошлого раза - пометьте его как отключенный в БД

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

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

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

Это делается с использованием PHP в базу данных MySQL.

== edit ==

Основной цикл этого процесса следующий:

while ($data = get_next_bit_of_data_from_xml())
{
     // this next line is the slow part
     if ($object = get_object_from_database($data['id']))
     {
           // update $object
           // ...

           // persist 
           $object->save();       
     }

     // build new object and persist
     // ...
}

Причина, по которой скрипт такой медленный, заключается в том, что я не могу использоватьлюбой вид массовых операций, таких как LOAD DATA INFILE, потому что для каждой записи в XML мне нужно проверить, существует ли объект.

Так что мне действительно интересно, может ли кто-нибудь предложить другой подход, который позволит мне массовозагрузка данных при сохранении ссылочной целостности с существующими данными.

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Вы можете использовать INSERT ... ON DUPLICATE KEY UPDATE см. Ссылку здесь .Сначала обновите все записи, которые будут отключены.Затем выполните приведенный выше запрос INSERT ... ON DUPLICATE KEY UPDATE, чтобы вставить или обновить существующие строки новыми данными, а также установить их включение.

1 голос
/ 08 июня 2011

Вы можете использовать INSERT DELAYED и UPDATE LOW_PRIORITY для ускорения процесса.

...