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

    @burguy83 Автор вопроса
    Александр Кузнецов, Благодарю. Дэцл кривой запрос получился, но я нашёл где.
    $valuesA[] = addValueQuotes($key)/*"'{$value}'"*/; вот тут видимо при копировании вставился $key поправил его на $value и значения подставились как нужно. Можно ещё совет насчёт моего супер пупер ON DUPLICATE KEY UPDATE (на 30 строчек) что с ним можно придумать? Может его как то присоединить к основному ИНСЕРТ? Задача у меня такая. Один раз залить, а потом (ежедневно) обновлять поля по главному полю. Т.е. либо обновлять поля либо создавать новую строчку.

    Я ещё не тестил на большой базе, но вот сейчас сервак подкрутят и попробую залиться. Проверим пакетную вставку поможет ли)))
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    Александр Кузнецов, Здравствуйте, забыл тыкнуть на никнейм, поэтому к вам моё предыдущее сообщение и не долетело. Если есть время можете глянуть на него?
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    Спасибо за доп информацию, я ещё в процессе написания и осознания предложенного Вами примера моего кода. Убил ну где то 1,5 часа на то чтобы понять почему не льётся в базу хотя вардампом всё хорошо показывало. ДЛЯ ТЕХ КТО БУДЕТ СМОТРЕТЬ НА МОЙ ПРИМЕР НЕ ЗАБУДЬТЕ ПОСТАВИТЬ "," после ($values)
    "INSERT INTO `leis`($fields) VALUES ($values), <----------------- вот тут.
    Я её сразу не заметил, в вардампе, что между первыми скобками нет запятой "(1.2.3) (4.5.6)" а как Вы поняли у меня полей дофигище и на экране просто каша))))

    Возник другой вопрос (после решения вопрос с запятой). Поставил код вроде по образу и подобию. У меня есть тестовый файл из 44 массивов. Указал $batchSize = 10; Ну и по логике думал должно залиться 40 массивов, Залились же все 44, отсюда делаю вывод, что я где то накосячил с расстановкой кода и счётчиков.
    Если не сложно посмотрите:
    $batchSize = 10;
             $counter = 0;
             $valuesBatch = array(); 
            foreach ($leiLEIRecordobj as $leiLEIRecords)
            {     
    
                   foreach ($leiLEIobj as $leiLEIs)
                   {} просто для примера что циклов много
    
                   foreach ($leiLEIobj as $leiLEIs)
                   {}просто для примера что циклов много
    
                   foreach ($leiLEIobj as $leiLEIs)
                   {}просто для примера что циклов много
    
    //И вот тут вставляю Ваш код в главном форейч
    $fields = "";
                $values = "";
                foreach ($arResult[$LEI] as $key => $value) 
                {
                    if ($key == "lei:LegalAddress" || $key == "lei:HeadquartersAddress" || $key == "lei:OtherAddresses") 
                    {
    
                        foreach ($value as $address => $valueAd) 
                        {
                            $fields .= "`" . $address . "`,";
    
                            $values .= "'" . $valueAd . "',";
                        }
    
                    } 
    
                    else 
                    {
                        $fields .= "`" . $key . "`,";
    
                        $values .= "'" . $value . "',";
    
                    }
    
                }
    
    
    
                $fields = rtrim ($fields , ",");
                //var_dump($fields);
                $values = rtrim ($values , ",");
                $counter ++;
                $valuesBatch[] = "($values)";
                var_dump($valuesBatch);
                
                
                
                if ($counter==$batchSize)
                {   
                    $qwery = strtr(
                        "INSERT INTO `leis`($fields) VALUES ($values), :text",
                        array(
                            ':text' => implode(",\r\n", $valuesBatch)
                        )
                    );
                    
                    $sql = mysqli_query($mysqli, $qwery);
    
                    // Выполнить запрос или записать его в общую переменную-накопитель
                    $counter = 0;    <-это я так понимаю обнуление счётчика после 10 записей.
                    $valuesBatch = array();
                    
                }
    
    
    
            }  <---главный цикл Форейч
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    Спасибо за наглядный пример, картина проясняется, буду пробовать.
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    спасибо за ссылку, попробую увеличить параметр key_buffer_size
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    sql, myisam, индекс только на id primery с автоинкриментом как я понимаю он не слишком влияет. в экспериментах я его отключал но получал такое же замедление со временем.
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    Про csv согласен что там можно выкрутиться допустим если нет элемента то ставить NULL - тогда поля съезжать не будут, потом залить в базу и поудалять эти NULL. Но мне кажется это муторнее как то сделать, не так давно в пхп как вы поняли. А вот вариант с пакетной вставкой мне кажется попроще. Но тут опять же в связи с моим "без года неделя" есть сложности с реализацией. Вот мой код на вставку:
    $fields = "";
                $values = "";
                foreach ($arResult[$LEI] as $key => $value) {
                    if ($key == "lei:LegalAddress" || $key == "lei:HeadquartersAddress" || $key == "lei:OtherAddresses") {
    
                        foreach ($value as $address => $valueAd) {
                            $fields .= "`" . $address . "`,";
    
                            $values .= "'" . $valueAd . "',";
                        }
    
                    } else {
                        $fields .= "`" . $key . "`,";
    
                        $values .= "'" . $value . "',";
    
                    }
    
                }
    
    
    
                $fields = rtrim ($fields , ",");
                $values = rtrim ($values , ",");
                
                $qwery = "INSERT INTO `leis`($fields) VALUES ($values) ON DUPLICATE KEY UPDATE `Legal-Country` = VALUES(`Legal-Country`), `lei:EntityStatus` = VALUES(`lei:EntityStatus`), `lei:LegalName` = VALUES(`lei:LegalName`), `lei:RegistrationStatus` = VALUES(`lei:RegistrationStatus`), `lei:OtherEntityName` = VALUES(`lei:OtherEntityName`), `lei:ValidationAuthorityID` = VALUES(`lei:ValidationAuthorityID`), `lei:RegistrationAuthorityEntityID` = VALUES(`lei:RegistrationAuthorityEntityID`), `lei:LegalJurisdiction` = VALUES(`lei:LegalJurisdiction`), `lei:OtherLegalForm` = VALUES(`lei:OtherLegalForm`), `lei:EntityStatus` = VALUES(`lei:EntityStatus`), `Legal-FirstAddressLine` = VALUES(`Legal-FirstAddressLine`), `Head-FirstAddressLine` = VALUES(`Head-FirstAddressLine`), `Legal-AdditionalAddressLine` = VALUES(`Legal-AdditionalAddressLine`), `Head-AdditionalAddressLine` = VALUES(`Head-AdditionalAddressLine`), `Legal-PostalCode` = VALUES(`Legal-PostalCode`), `Head-City` = VALUES(`Head-City`), `Legal-City` = VALUES(`Legal-City`), `Head-Region` = VALUES(`Head-Region`), `Legal-Region` = VALUES(`Legal-Region`), `Head-Country` = VALUES(`Head-Country`), `Other-FirstAddressLine` = VALUES(`Other-FirstAddressLine`), `Other-AdditionalAddressLine` = VALUES(`Other-AdditionalAddressLine`), `Other-City` = VALUES(`Other-City`), `Other-Region` = VALUES(`Other-Region`), `Other-Country` = VALUES(`Other-Country`), `Other-PostalCode` = VALUES(`Other-PostalCode`), `lei:InitialRegistrationDate` = VALUES(`lei:InitialRegistrationDate`), `lei:LastUpdateDate` = VALUES(`lei:LastUpdateDate`), `lei:EntityStatus` = VALUES(`lei:EntityStatus`), `lei:NextRenewalDate` = VALUES(`lei:NextRenewalDate`), `lei:ManagingLOU` = VALUES(`lei:ManagingLOU`), `lei:ValidationSources` = VALUES(`lei:ValidationSources`)";
    
                $sql = mysqli_query($mysqli, $qwery);


    Запрос немного модифицировал с помощью ON DUPLICATE KEY UPDATEб т.к пхп скрипт умирает и при новой записи он начинает мне дубли делать. Это модификация естественно ещё дольше отрабатывает.
    Но вот как из этого чуда юда мне сделать пакетно не понимаю и не понимаю опять же эту пакетную вставку делать в главном форейч или надо как то выносить за него и там вставлять (а возможно ещё использовать счётчик)?
  • Как ускорить инсерты в базу sql?

    @burguy83 Автор вопроса
    Вот про это я и говорил, но что то не понимаю я как это реализовать. Как собрать определённое кол-во значений и шлёпать разом. Я так понимаю надо со счётчиком это дело реализовывать. Но пока мне не удавалось записывать скажем в базу каждые 1000 итераций.