• Как ускорить инсерты в базу sql?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Лучше всего делать пакетную вставку или же конвертировать xml в соответствующий sql (с теми же пакетными вставками) и выполнить его через
    mysql -u username -p password database_name < /path/to/your/file.sql

    Обратите внимание, на -p password, между ними, если мне не изменяет память, нет пробела.

    Для варианта с SQL формируйте вот такое:
    INSERT INTO tbl_name
        (a,b,c)
    VALUES
        (1,2,3),
        (4,5,6),
        (7,8,9);


    Только не три строки, а по 100-500 - думаю подберете соотношение.

    Примерный код формирования, основанный на вашем примере:
    <?php
    $batchSize = 1000;
    $counter = 0;
    $valuesBatch = array();
    
    foreach ($leiLEIobj as $leiLEIs)
    {
        foreach ($leiLEIobj as $leiLEIs)
        {
            $LEI = $leiLEIs->nodeValue;
            $arResult[$LEI][$leiLEIs->nodeName] = $LEI; 
            //$LEIs[$row->nodeName] = $row->nodeValue;
        }
    
        $valuesBatch[] = "($values)";
        $counter ++;
        
        if ($counter==$batchSize)
        {
            $qwery = strtr(
                "INSERT INTO `leis`($fields) VALUES ($values) :text",
                array(
                    ':text' => implode(",\r\n", $valuesBatch)
                )
            );
    
            // Выполнить запрос или записать его в общую переменную-накопитель
            $counter = 0;
            $valuesBatch = array();
        }
    }


    P.S. csv так же можно сформировать нужным образом из XML, дополнив значениями по умолчанию те, которых в xml-строке нет, а дальше что-то подобное вот этому:
    LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (col1, col2, col3, col4, col5...);
    Ответ написан
    9 комментариев