Самый эффективный способ выполнить большой запрос SQL с помощью PHP? - PullRequest
2 голосов
/ 24 июня 2019

Каждые три месяца мне необходимо загружать CSV-файл, содержащий около 400 000 продуктов, и вставлять их в базу данных MySQL.Я не чувствую, что мой метод очень эффективен и хотел бы получить некоторые предложения.

В настоящее время я анализирую файл CSV следующим образом:

public function parse_csv_to_array() {

    // Initialize empty array 
    $array = $fields = array(); 

    $interval = 0;

    // File Handle
    $handle = @fopen($this->csvFile, "r");

    if ($handle) {

        while (($row = fgetcsv($handle, 4096)) !== false) {

            if (empty($fields)) {
                $fields = $row;
                continue;
            }

            foreach ($row as $k=>$value) {
                $array[$interval][$fields[$k]] = $value;
            }

            $interval++;
        }

        if (!feof($handle)) {
            echo "Error: unexpected fgets() fail\n";
        }

        fclose($handle);
    }

    return $array;
}

Затем я просто перебираю массив, вставляя новыйили замена существующей записи, если она уже присутствует.Это означает, что я выполняю не менее 1,2 миллиона запросов SQL, чтобы сначала проверить, присутствует ли запись, а затем вставить / заменить запись в базе данных.

В настоящее время это выполняется в виде загрузки формы HTML5 и выполняется пользователями.браузер, как только они нажимают кнопку отправить.Весь процесс может занять до 30 минут, что я не считаю плохим, но мне пришлось установить неограниченное время ожидания PHP-скрипта, чтобы скрипт мог работать.Я не чувствую, что это очень эффективно и значительно увеличивает нагрузку на сервер.Мне было интересно, если есть методы сегментации массива и загрузки записей в разделах или я должен использовать планировщики, такие как CRON.Идея просто выполнить 1,2 миллиона SQL-запросов в одном скрипте кажется грязной, и должен быть лучший способ.Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Я думаю, что использование кусков и cron было бы лучшим решением.Запускайте ваш cron каждые несколько минут, ища новые данные и загружая их в базу данных, если они есть.Затем он может работать в фоновом режиме.

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

0 голосов
/ 24 июня 2019

Вы можете сделать один запрос, чтобы вернуть все записи, сохранить записи в массиве, сравнить данные в CSV со значениями в массиве и обновить при необходимости. Вы также можете создать массив только с теми значениями, которые необходимо обновить, а затем выполнить массовую вставку.

В этом методе вы не делаете столько запросов к базе данных, следовательно, она должна быть менее ресурсоемкой.

...