PHP大大加快了脚本的执行速度

PHP大大加快了脚本的执行速度,php,arrays,Php,Arrays,我有一个沉重的脚本,我们运行很多。以下是使用的算法: 从数据库中加载4500行并将其存储为数组。(A) 从数据库中加载600000行并将其存储为数组。(B) 对于(A)中的每个元素,查找(B)中的匹配项 转到(A)中的下一个元素 所以这个脚本的最大迭代量是4500*60000,也就是270000000,所以您知道这对于PHP来说可能有点麻烦 我能让这个过程更有效率吗? 从数据库中读取行并不是一个真正的问题,而是数组迭代带来了巨大的成本 它确实工作得很快,但有一个因素(60000)将在未来几年大大

我有一个沉重的脚本,我们运行很多。以下是使用的算法:

  • 从数据库中加载4500行并将其存储为数组。(A)

  • 从数据库中加载600000行并将其存储为数组。(B)

  • 对于(A)中的每个元素,查找(B)中的匹配项

  • 转到(A)中的下一个元素

  • 所以这个脚本的最大迭代量是4500*60000,也就是270000000,所以您知道这对于PHP来说可能有点麻烦

    我能让这个过程更有效率吗? 从数据库中读取行并不是一个真正的问题,而是数组迭代带来了巨大的成本

    它确实工作得很快,但有一个因素(60000)将在未来几年大大增加


    有什么想法吗?

    这里有一些不同的答案。我猜第一个是对的,第二个 这很容易,也足够了,但很难确定

    可能的答案1:使用SQL 正如评论所指出的,这听起来非常像一个连接。此外,你的帖子似乎 指示仅在找到匹配项时才执行操作,而不是每个元素 在一场比赛中。这意味着您的SQL语句应该只返回匹配的行,而不是 都是。你不能做我所说的一切都没关系,如果你愿意的话 为您整理数据

    可能的答案2:对数组进行排序 也许您可以对数组进行排序(同样,最好让您的数据库进行排序)。可能是你 可以对B进行排序,以便更快地搜索匹配项。或者将搜索值放入 数组,因此搜索速度非常快。或者,如果你幸运的话,你可以把两者都分类 以使所有a和B的顺序相同的方式排列。i、 e.对于你选择的任何A 知道右B不存在或稍后在B数组中存在

    可能的答案3:更多地解释这个问题 你只给了我们你当前的算法,而不是你真正想要做的。最 可能对所有内容进行迭代并不是最好的主意,但除非知道,否则没有人可以说
    更多关于您的数据以及您最终想要做什么的信息。

    当然,这取决于您的数据

    一些一般方面:

    • 这听起来像是数据库查询的用例,而不是php脚本。数据库擅长在数据集中寻找匹配项,即使在同一个联盟中,也不会有任何技巧让php脚本发挥作用
    • 如果您真的必须使用php脚本函数,请尝试

      • 不要达到允许的内存限制。您的php服务器将退出并出现一个错误,但是如果sql站点结果集变得太大,您的sql服务器可能会开始将临时数据写入hd,这将减慢整个执行时间->如果可能,获取并分块处理数据(偏移量、限制)
      • 如果匹配整个单词,请以这样的方式构建匹配数组,即搜索条件是键而不是值,这样您就可以使用
        isset($potentialMatches[$searchTerm])
        ,这比数组($searchTerm,$potentialMatches)中的
        对于较大的数组要快得多。模型:

        而($row=$resultSet->fetch_assoc()){ $potentialMatches[$row['search\u column']]=$row; }


    但这一点再强调也不过分:处理这一问题的通常方法是:

  • 做匹配的DB端
  • 处理脚本中的匹配项
  • 如有必要:对不匹配项执行新查询
  • 如果是3,则在脚本中处理这些结果

  • 请提供您的查询。我想你可以用纯SQL实现这一点。SQL加入任何人。。。?我们这里没有足够的信息来优化任何细节。也许你真的需要迭代所有这些数组。也许你没有。我们不知道。除了寻找a和B之间的匹配,这可能可以通过重写SQL查询来处理;如果找到匹配项或未找到匹配项,您实际会做什么?如果找到匹配项,我会运行一个简单的case开关。因此,我不能对所有事情都使用SQL。由于这些数组元素的处理,我需要迭代。我想的是,也许有一个php库可以加速迭代和数组处理。如果没有找到匹配项,你会怎么做?SQL查询可以消除大量的迭代;但并没有“魔弹”能让我更快地迭代PHP库。。。。虽然你可以考虑使用而不是标准PHP数组…至少,它会减少你的内存使用