【发布时间】:2019-04-26 02:52:43
【问题描述】:
我正在排除为什么一个 php 脚本需要这么长时间才能运行并且有时会超时。我有一个数据库,其中包含来自少数(总共 9 个)供应商的产品信息(总共约 50,000 条记录)。该脚本从每个供应商的提要中提取一个包含更改的产品列表的 XML 文件,找到该记录,然后对其进行适当的修改。
在产品表中查找与供应商的 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,根据 phpMyAdmin,查询本身需要 0.2218 秒才能返回 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
谁能帮我准确理解是什么让我的查询花费了这么长时间,以及我如何才能提高性能?
【问题讨论】:
-
这些字段是否有索引?
-
我有一个关于 SupplierID 的索引。我在 SKU 上没有一个,因为大约 60-70% 的 SKU 是唯一的(很遗憾,它们在这些提要中没有 UPC 代码,以帮助在多个供应商之间识别相同的产品)。
-
我仍然认为索引该列会有所帮助。诚然,我真的不知道索引是如何工作的,只是它们是一种无需遍历每个条目即可在数据库中查找内容的方法。索引?指数?索引?