2015-06-16 3 views
-2

У меня есть лист excel, который содержит данные в чем-то вроде этого ex. если в листе есть столбцы «город» и «имя человека». Каждый раз, когда нам нужно проверять, существует ли город в таблице города (mysql) или нет, если нет, то новая строка будет вставлена ​​для городской таблицы города, аналогично будет проверяться для человека name также, если не существует в таблице person (mysql), тогда нам нужно сохранить имя человека в таблице person. Итак, что может быть лучшим способом импортировать тяжелый файл excel из 2gb по крайней мере в mysql, используя php в приведенном выше объясненном сценарии, чтобы меньше запросов выполнялось с меньшей нагрузкой на сервер, и выполнение будет выполняться за долю секунд. Просьба предложить оптимизированное решение для вышеуказанного сценария.import heavy excel to mysql using php

+2

На что Вы смотрели? Существует так много способов приблизиться к этому, вам нужно начинать и видеть, где вы получаете проблему, для кого-то невозможно предложить полное решение. –

+0

Не понимаю, почему вы не импортируете jus один раз –

+0

Привет, Майк, не могли бы вы предоставить мне только один лучший подход, который может сделать это с меньшим количеством запросов и быстрым выполнением @MikeMiller – rishi

ответ

0

Для высокой скорости приема, который необходимо «нормализовать» данные, как она идет, сделать это в два этапа (после загрузки исходных данных в временную таблицу):

Во-первых, добавить новые значения (из host_name в данном примере):

# This should not be in the main transaction, and it shoud be with autocommit = ON 
# In fact, it could lead to strange errors if this were part of the main transaction and it ROLLBACKed. 
INSERT IGNORE INTO HostNorm (host_name) 
    SELECT DISTINCT s.host_name 
     FROM Staging AS s 
     LEFT JOIN HostNorm AS n ON n.host_name = s.host_name 
     WHERE n.host_id IS NULL; 

Затем возьмите host_id для ввода в таблицу фактов:

# Also not in the main transaction, and it should be with autocommit = ON 
# This multi-table UPDATE sets the ids in Staging: 
UPDATE HostNorm AS n 
    JOIN Staging AS s ON s.host_name = n host_name 
    SET s.host_id = n.host_id 

More discussion in my blog