@hirohitoqwe

Как оптимизировать INSERT запросы в PDO(phpmyadmin)?

Мне нужно спасирть 45 тысяч слов и отправить их по одному в БД и это происходит очень долго(как я читал должно максимум 20 секунд) Как мне ускорить работу моего скрипта?
function sendHashtag($page,$dbh){//функция для отправки в бд
    $html = new DOMDocument('1.0', 'UTF-8');
    $html->loadHTML("\xEF\xBB\xBF".$page);
    $elements=getElementsByClass($html,'div','tags');//получаю все необходимое
    foreach ($elements as $element){
        $str=str_replace(" ", '', $element->textContent);
        $sth=$dbh->prepare("INSERT INTO `hashtag`(`hashtag`) VALUE(:hashtag)");
        $sth->bindParam(':hashtag',$str);
        $sth->execute();
    }
}
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 3
SagePtr
@SagePtr
Еда - это святое
А зачем в цикле каждый раз заново создавать подготовленное выражение? Можно вне цикла его создать один раз, забиндовать параметр, а в цикле только каждый раз его подставлять и выполнять execute.
Ответ написан
Комментировать
402d
@402d
начинал с бейсика на УКНЦ в 1988
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
Пример.

На стороне PHP имеется массив строк:

aaa
bbb
ccc

Необходимо записать его в таблицу. Причём уложиться в один запрос. Длина списка, понятно, не фиксирована.

Первое - объединяем/сериализуем этот массив в одно значение. Допустим, выбрали JSON массив. То есть ["aaa", "bbb", "ccc"]
И именно этот JSON мы передадим в запрос.

Далее на стороне MySQL надо разобрать JSON на элементы и вставить в таблицу. Это делается одним запросом.
INSERT INTO destination_table (single_value)
SELECT single_value
FROM JSON_TABLE( ? ,
                 '$[*]' COLUMNS ( single_value VARCHAR(255) PATH '$' )) jsontable;

И... а, собственно, всё.

Осталось только убедиться, что размер строкового представления данных не превышает установленный в MySQL размер входящего пакета, и, если превышает, то соответствующим образом подрихтовать сессионную переменную max_allowed_packet. Впрочем, дефолтно там 67108864 байтов, это порядка 1480 байтов на элемент - должно хватить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы