我需要帮助来解决为什么mySQL查询花费比预期更长的时间的问题

时间:2019-04-25 18:46:50

标签: php mysql database

我正在解决为什么php脚本需要花费这么长时间才能运行并且有时会超时的问题。我有一个数据库,其中充满了来自少数(总共9个)供应商的产品信息(约50,000条记录)。该脚本提取一个XML文件,其中包含每个供应商的feed中有更改的产品列表,找到该记录,然后对其进行适当的修改。

在产品表中查找与供应商的SKU和供应商ID相匹配的单个产品记录的查询耗时为0.25秒至0.5秒,因此约400行的小更新耗时超过2分钟。我是数据库性能的新手,我一直在努力理解为什么我有一个非常简单的查询要花很长时间才能运行。

我首先注释掉每个查询在数据库中的查询,以查看脚本本身迭代XML文件所花费的时间。它将在1-2秒内遍历400条记录。然后,我在迭代中遇到的第一个查询中添加了该查询,该查询正在执行搜索以在表中为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秒才根据phpMyAdmin返回1个结果,但Profile结果总共返回了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 个答案:

答案 0 :(得分:4)

为获得更好的性能,请确保您在

上具有复合索引
table  productLinks 

columns  (affiliateSKU, supplierID)