【问题标题】:I need help troubleshooting why mySQL queries are taking longer than expected我需要帮助解决为什么 mySQL 查询花费的时间比预期的长
【发布时间】: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 代码,以帮助在多个供应商之间识别相同的产品)。
  • 我仍然认为索引该列会有所帮助。诚然,我真的不知道索引是如何工作的,只是它们是一种无需遍历每个条目即可在数据库中查找内容的方法。索引?指数?索引?

标签: php mysql database


【解决方案1】:

为了获得更好的性能,请确保您有一个复合索引

table  productLinks 

columns  (affiliateSKU, supplierID)

【讨论】:

  • 是的,索引!这很可能是事情。索引列(或者在这种情况下,将列组合索引在一起)可以使针对该列(或集合)的搜索速度更快,因为它不必查看数据库中的每个条目
  • @Stevish 。正确..索引减少了避免全表扫描的时间..并且(不是在这种情况下,因为有一个SELECT *)可以直接从索引中检索数据并避免访问数据表
  • 哇!这很完美。我还没有偶然发现/了解综合指数。我最初在 SupplierID 上创建了一个索引。一旦我按照建议添加了复合索引,该查询的运行时间就会下降到 0.0007 秒,而脚本现在需要 1 秒或更短的时间来遍历所有 400 条记录。非常感谢!
  • 这很神奇,我告诉你!一个简单的索引实际上将您的搜索速度提高了 1,000 倍!这应该是不可能的!这很神奇。
  • 我很高兴..良好的索引对于获得和保持最佳性能至关重要...索引..是数据库调优的主要(基础)步骤
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多