繁体   English   中英

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

[英]Need faster PHP/MySQL search algorithm for highly complex calculations

我现在正试图解决一个难题。 我有一个名为“ 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的表进行此操作,以运行所有计算。 该系统现在陷入困境,并试图对所有这些数据进行处理而超时。 因此,现在我正在尝试寻找一种更好的方法。

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

我的另一个想法是获取所有generic_pricing数据的2个关联数组。 即,所有行的一个数组由clei索引,另一行全部由partNumber索引。 但是由于我正在寻找子字符串,所以这行不通。

我不知所措,无法有效地完成这项任务。 我有什么事情可以简化吗?

不要查询所有行的数据库,并在您的应用程序对它们进行排序。 会引起更多的头痛。 这里有一些建议:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM