Мне нужна помощь в устранении неполадок, почему запросы MySQL занимают больше времени, чем ожидалось - PullRequest
3 голосов
/ 25 апреля 2019

Я устраняю неполадки, почему php-скрипт занимает так много времени и может иногда зависать. У меня есть база данных, заполненная информацией о продукте (всего около 50 000 записей) от нескольких (всего 9) поставщиков. Сценарий извлекает файл XML, содержащий список продуктов, в которых есть изменения в ленте каждого поставщика, находит эту запись и затем соответствующим образом изменяет ее.

Запрос на поиск отдельной записи продукта, которая соответствует SKU и ID поставщика в таблице продуктов, занимает от 0,25 до 0,5 секунд, поэтому небольшое обновление ~ 400 строк занимает более 2 минут. Я новичок в производительности базы данных и пытаюсь понять, почему у меня очень простой запрос, выполнение которого занимает невероятно много времени.

Сначала я прокомментировал каждый запрос, в котором он выполнял поиск в базе данных, чтобы узнать, сколько времени потребуется самому сценарию для перебора файлов XML. Он будет перебирать 400 записей за 1-2 секунды. Затем я добавил в первый запрос, который встречается в итерации, который выполнял поиск, чтобы найти правильную запись в таблице для продукта, вызванного в файле XML. Именно здесь время для скрипта увеличилось до 2 минут.

Код итерации, обобщенный для соответствующих частей:

$checkq = "SELECT * FROM productLinks WHERE affiliateSKU=:sku AND supplierID=:sid";
$checkqs = $DBHa->prepare($checkq);

$xml = simplexml_load_file($supplierURL,"SimpleXMLElement",LIBXML_NOCDATA);
foreach($xml->children() as $products) { 
 //Set variables from the XML

 $checkqs->execute(array(':sku'=>$sku, ':sid'=>$supplierID)); //This is the problem query
 //I capture the number of results (should always be 1 or 0), 
 //and modify the entry if the result is 1, and insert a new entry if 0)
}

В своем исследовании, в чем может быть проблема, я выбрал случайную запись и выполнил вышеуказанный запрос непосредственно в phpMyAdmin, и время его работы составляло от 0,1 до 0,75 секунды. Я использовал некоторые шаги по поиску и устранению неисправностей, которые я нашел во время исследования, но не могу понять, что это на самом деле означает.

Я использовал оператор Explain и возвратил следующее:

id | select_type | table        | type | possible_keys | key        | key_len | ref   | rows  | Extra
1  | SIMPLE      | productLinks | ref  | supplierID    | supplierID | 4       | const | 11827 | Using where

Затем я запустил Profile для запроса, и, хотя самому запросу потребовалось 0,2218 секунд, чтобы вернуть результат 1 согласно phpMyAdmin, результаты профиля вернули в общей сложности 0,00293 секунды следующим образом:

Status                Duration
starting              0.000132
checking permissions  0.000009
Opening tables        0.000007
init                  0.000011
optimizing            0.000007
executing             0.000010
end                   0.000007
query end             0.000006
closing tables        0.000019
freeing items         0.000075
cleaning up           0.000010

Может ли кто-нибудь помочь мне точно понять, почему мой запрос занимает так много времени и как я могу улучшить производительность?

1 Ответ

4 голосов
/ 25 апреля 2019

Для лучшей производительности убедитесь, что у вас есть составной индекс на

table  productLinks 

columns  (affiliateSKU, supplierID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...