Оператор SQL медленно работает - PullRequest
0 голосов
/ 08 мая 2019

Я разработал импортер, который перебирает файл (10K + строки) и записывает файл CSV в базу данных MySQL. К сожалению, это очень медленно! Не могли бы вы дать мне совет, как улучшить следующий код?

for($i=1; $i<count($data); $i++) {
                                        $rowData = $data[$i];
                                        if(isset($rowData[0])){
                                            $brandingPositionDataSql = 'SELECT * from branding_position WHERE sku_simple_product ="'.$rowData[0].'" AND branding_position_de ="'.$rowData[1].'" AND branding_id = "'.$rowData[8].'" AND handling_group_id = "'.$rowData[9].'" AND pre_cost_id = "'.$rowData[11].'"';
                                            $fetchBradingData = $connection->fetchAll($brandingPositionDataSql);

                                            if(count($fetchBradingData) >= 1){
                                                $updateBrandingDataSql = 'UPDATE branding_position SET sku_simple_product="'.$rowData[0].'", branding_position_de   ="'.$rowData[1].'",branding_position_en="'.$rowData[2].'",branding_position_fr  ="'.$rowData[3].'",branding_position_es="'.$rowData[4].'",branding_position_it  ="'.$rowData[5].'",branding_position_pl="'.$rowData[6].'",branding_position_nl="'.$rowData[7].'",branding_id="'.$rowData[8].'",is_branding_incl='.$rowData[10].' WHERE sku_simple_product ="'.$rowData[0].'" AND  branding_position_de ="'.$rowData[1].'" AND  branding_id = "'.$rowData[8].'" AND handling_group_id = "'.$rowData[9].'" AND pre_cost_id = "'.$rowData[11].'"';
                                                $connection->query($updateBrandingDataSql);
                                            }else{
                                                $sql1 = 'INSERT INTO branding_position (sku_simple_product, branding_position_de, branding_position_en, branding_position_fr, branding_position_es, branding_position_it, branding_position_pl, branding_position_nl, branding_id, handling_group_id, is_branding_incl, pre_cost_id) VALUES ("'.$rowData[0].'","'.$rowData[1].'","'.$rowData[2].'","'.$rowData[3].'","'.$rowData[4].'","'.$rowData[5].'","'.$rowData[6].'","'.$rowData[7].'","'.$rowData[8].'","'.$rowData[9].'",'.$rowData[10].',"'.$rowData[11].'")';
                                                $connection->query($sql1);
                                            }
                                          }
                                        }

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Я до сих пор не понимаю, что ты делаешь. Но вот несколько советов:

  • Используйте LOAD DATA INFILE ... для копирования файла CSV в таблицу. Это очень быстро.
  • Если данные (из LOAD) нуждаются в манипулировании (до UPDATEing или INSERTing), LOAD в дополнительную таблицу, тогда выполните массовые манипуляции.
  • что SELECT и UPDATE нуждаются в индексе из 5 столбцов для 5 столбцов, упомянутых в предложении WHERE; они могут быть в любом порядке.
  • Попробуйте использовать INSERT ... ON DUPLICATE KEY UPDATE ..., чтобы избежать выбора + проверки существования + обновления. Вероятно, вы можете сделать один IODKU для всех данных LOADed из дополнительной таблицы.
0 голосов
/ 11 мая 2019

@ Рик Джеймс:

Вот некоторые примеры данных

@ Рик Джеймс Вот один пример для запросов выше:

SELECT  *
    from  branding_position
    WHERE  sku_simple_product ="01-06721001-00000"
      AND  branding_position_de ="Oberseite - 20.00 x 0.00 / 0.00"
      AND  branding_id = "01-DB1"
      AND  handling_group_id is NULL
      AND  pre_cost_id = "01-A.STK";

UPDATE  branding_position SET sku_simple_product="01-06721001-00000",
        branding_position_de ="Oberseite - 20.00 x 0.00 / 0.00",
        branding_position_en="Oberseite - 20.00 x 0.00 / 0.00",
        branding_position_fr ="Oberseite - 20.00 x 0.00 / 0.00",
        branding_position_es="Oberseite - 20.00 x 0.00 / 0.00",
        branding_position_it ="Oberseite - 20.00 x 0.00 / 0.00",
        branding_position_pl="Oberseite - 20.00 x 0.00 / 0.00",
        branding_position_nl="Oberseite - 20.00 x 0.00 / 0.00",
        branding_id="01-DB1",is_branding_incl='0'
    WHERE  sku_simple_product ="01-06721001-00000"
      AND  branding_position_de ="Oberseite - 20.00 x 0.00 / 0.00"
      AND  branding_id = "01-DB1"
      AND  handling_group_id = ""
      AND  pre_cost_id = "01-A.STK ";
...