[英]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索引。 但是由于我正在寻找子字符串,所以这行不通。
我不知所措,无法有效地完成这项任务。 我有什么事情可以简化吗?
不要查询所有行的数据库,并在您的应用程序对它们进行排序。 会引起更多的头痛。 这里有一些建议:
in
工作。 而不是像... left(clei,8) in ('IDX100AB','IDX100AC','IDX101AB'...)
中使用... left(clei,8) in ('IDX100AB','IDX100AC','IDX101AB'...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.