需要更快的PHP / MySQL搜索算法来进行高度复杂的计算

时间:2014-07-24 16:52:15

标签: php mysql sql regex algorithm

我现在正试图解决的困境。我有一个名为" generic_pricing"有超过一百万行。它看起来像这样......

我有一个25000个零件的清单,我需要获取generic_pricing数据。有些部分有CLEI,有些有partNumber,有些有两部分。对于25000个部分中的每个部分,我需要搜索generic_pricing表以查找与clei或partNumber匹配的所有行。

让事情变得更加困难的是我必须根据子字符串搜索进行匹配。例如,我的一个零件的CLEI为" IDX100AB01",但我需要查询的结果,如....

SELECT * FROM generic_pricing WHERE clei LIKE 'IDX100AB%';

目前,我用于查找这些匹配的冗长PHP代码使用以下逻辑来循环遍历25000个项目。对于每个项目,我在clei上使用上面的查询。如果找到,我会使用该行进行计算。如果没有,我在partNumber上执行类似的查询以尝试查找匹配。

您可以想象,这非常耗时。这必须在大约10个类似于generic_pricing的其他表中完成,以运行所有计算。该系统现在正在陷入困境并暂时试图破坏所有这些数据。所以现在我想找到一个更好的方法。

我有一个想法是只查询数据库一次以获取所有行,然后使用循环来查找匹配项。但是对于25000个项目,每个项目必须与超过一百万行进行比较,这似乎需要更长时间。

我的另一个想法是获得所有generic_pricing数据的2个关联数组。即由clei索引的所有行的一个数组,另一个由partNumber索引。但是因为我在寻找子串,所以它不会起作用。

我在这里找不到有效的方法来处理这项任务。有什么我可以忽略的简化这个吗?

1 个答案:

答案 0 :(得分:0)

查询所有行的数据库并在应用中对它们进行排序。会引起更多的麻烦。 以下是一些建议:

  1. 使用参数化查询。这允许您的数据库引擎编译一次查询并多次使用它。否则,每次都必须优化和编译查询。
  2. 找出使in工作的方法。而不是像try ... left(clei,8) in ('IDX100AB','IDX100AC','IDX101AB'...)
  3. 那样使用
  4. 在db端进行计算/数学运算。构建一个存储过程,它接受部分/ clei数字列表,并以计算出的价格输出相同的列表。您将拥有更多的执行控制权和更少的网络开销。如果不是存储过程,则构建视图。
  5. 分页。如果在某处显示此数据,请切换到100或更少的批处理。
  6. 制作备忘单。如果速度是一个问题,请尝试每晚将价格预先计算到一个单独的表格中,如果需要,请包含一些部分线索/部件号码。然后使用预先计算的查找表。