Я пробегаем по 40 ассоциативных массивов:PHP цикл - низкая производительность SQL
array(
'key0' => value,
'url0' => value,
'tit0' => value,
'cdn0' => value,
'cdn1' => value,
'cdn2' => value,
)
и я совершаю множественным select
и один возможныеinsert
запросы. Я попытался оптимизировать производительность, уменьшив количество запросов.
foreach($buf){
$sth1->execute();//SELECT * FROM metadata WHERE url = '{$buf['url0']}'
$sth2->execute();//SELECT * FROM metadata WHERE key = '{$buf['key0']}'
if(!$ret=$sth1->fetch(PDO::FETCH_ASSOC)){
if($sth2->fetch(PDO::FETCH_ASSOC)){
die('key duplicate - error');
}
$data[ ] = $buf;
$sth3->execute();//INSERT INTO metadata ...
} else {
$data[ ] = $ret;
}
Это, однако, медленно (цикл занимает около 4,2 секунды). Я попытался сделать это быстрее, удалив запрос.
foreach($buf){
$sth1->execute();//SELECT * FROM metadata WHERE url = '{$buf['url0']}' OR key = '{$buf['key0']}'
if(!$ret=$sth1->fetch(PDO::FETCH_ASSOC)){
$sth3->execute();//INSERT INTO metadata ...
$data[ ] = $buf;
} else {
if($ret['key']==$generated_key){die('key duplicate - error');}
$data[ ] = $ret;
}
Это по какой-то причине сделало его еще медленнее (5-6 с). Таким образом, я остался невежественным. Как я могу сделать это с разумным временем загрузки? Я попытался поставить $sth2->execute
в операторе if(!$ret...)
, но это не дает мне никакой скорости.
Это не похоже на INSERT
, что является проблемой, поскольку большинство из array
данных уже IN
базы данных. Всякий раз, когда я запускаю запросы в phpmyAdmin, он делает это за 0.0000000003 секунды, поэтому он должен иметь какое-то отношение к циклу.
Я бы попытался использовать одну транзакцию для всех вставок. Он изменяет объем работы, который должна выполнять база данных и когда она это делает. Запустите «транзакцию» перед вашим «циклом foreach» и закройте его. Имейте в виду. любые ошибки, то все 40 вставок нужно будет сделать снова. –
Готово. Небольшое увеличение скорости. (.2s). Спасибо. – KaekeaSchmear
Хмм ... это неутешительно. Я бы предложил «объяснить план» и запрограммировать запрос, чтобы увидеть, где он проводит время. Я также хотел бы рассмотреть «подготовку» запросов до цикла «foreach». –