【问题标题】:PHP's in_array vs. MySQL SELECTPHP in_array 与 MySQL SELECT
【发布时间】:2011-03-30 10:00:43
【问题描述】:

我需要检查我的数据库中是否已经有一些整数值(它一直在增长)。它应该在一个脚本中完成数千次。我正在考虑两种选择:

  1. 将所有这些数字从 MySQL 数据库读入 PHP 数组,每次需要检查时,使用 in_array 函数。
  2. 每次我需要检查数字时,只需执行 SELECT number FROM table WHERE number='#' LIMIT 1 之类的操作

一方面,在存储在 RAM 中的数组中搜索应该比每次查询 mysql 更快(正如我所提到的,这些检查在一个脚本执行期间执行了大约一千次)。另一方面,数据库正在增长,该数组可能会变得非常大,这可能会减慢速度。

问题是 - 在其他方面哪种方式更快或更好?

【问题讨论】:

  • 数据库是为查询和搜索而构建的,有时它们也是缓存的RAM。 PHP 的数组函数擅长搜索,但与已编译的数据库引擎比不上。
  • 您确实有内存限制,因此将所有内容放在数组中可能根本无法提供解决方案。如果您使用的是大型数据库,缓存是唯一的方法,但您确实需要首先确定可接受的数据新鲜度。
  • 这个数据库表有多大? 10行? 1000 行? 1,000,000 行? 1,000,000,000 行? (答案将对最优策略产生巨大影响)......另外,你能“批量”这些数字吗(所以不是做 3000 个查询,而是每个查询 100 个数字只做 30 个)?
  • 在那个大小下,两边都不是很清楚(一个 5000 行的 int 数组会占用相当多的内存,但不是一个荒谬的数量),并且数组操作的开销可能是由 TCP 开销抵消。所以我认为你是正确的,两者都差不多。多一点数据(比如 50k+ 行),数据库会更快。少一点(比如 1k 行),php 可能会更快。所以我不认为速度将是主要问题......
  • 嗯,那也可能取决于脚本。通常,这取决于服务器上的内存限制以及脚本的使用位置。你能描述一些关于它的更多细节吗? 5k 对于数据库来说是一个很小的数字,即使它是 MySQL。另一方面,如果您的数据库服务器驻留在不同的机器上,这可能是个问题。我会使用 DB 解决方案,但会尝试优化查询数量。

标签: php mysql arrays


【解决方案1】:

我不得不同意 #2 是您的最佳选择。当使用LIMIT 1 执行查询时,MySQL 会在找到第一个匹配项时停止查询。确保您要搜索的列已编入索引。

【讨论】:

    【解决方案2】:

    听起来您在代码中复制唯一约束...

    CREATE TABLE MyTable(
    SomeUniqueValue    INT NOT NULL
    CONSTRAINT MyUniqueKey UNIQUE (SomeUniqueValue));
    

    【讨论】:

    • 不,我不知道。我需要在我的算法中检查它。
    【解决方案3】:

    您需要检查的次数与存储在数据库中的值的数量相比如何?如果它是 1:100,那么您每次在数据库中搜索可能会更好,如果它(一些)更少,那么预加载列表会更快。测试时发生了什么?

    但是,即使该比率足够低,可以更快地加载整个表,这也会占用内存,结果可能会使其他所有内容运行得更慢。

    所以我建议不要将它全部加载到内存中。但是,如果可以的话,请批量检查,以尽量减少往返数据库的次数。

    C.

    【讨论】:

      【解决方案4】:

      查询数据库是最好的选择,因为您说数据库正在增长,这意味着新值被添加到表中,而在 in_array 中您将读取旧值。其次,您可能会用大量数据耗尽分配给 PHP 的 RAM。第三,mysql 有自己的查询优化器和其他优化,这使它成为比 php 更好的选择

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 2014-01-30
        • 2011-11-16
        • 1970-01-01
        相关资源
        最近更新 更多