PHP的in_array与MySQL SELECT的区别

4
我需要检查某个整数值是否已经存在于我的数据库中(该数据库正在不断增长)。而且在一个脚本中需要进行数千次检查。我考虑了两种选择:
1. 从MySQL数据库中读取所有这些数字到PHP数组中,每次需要检查时使用in_array函数。 2. 每次需要检查数字时,只需执行类似于SELECT number FROM table WHERE number='#' LIMIT 1的语句。
一方面,搜索存储在RAM中的数组应该比每次查询mysql更快(如我所提到的,在一个脚本执行期间要执行大约一千次这样的检查)。另一方面,数据库正在增长,那个数组可能会变得相当大,这可能会减慢事情的速度。
问题是 - 哪种方法更快或在其他方面更好?

6
数据库被构建成可查询和搜索的形式,有时也会被缓存在RAM中。PHP的数组函数适合搜索,但与编译型数据库引擎相比不足为道。 - Bob Fincheimer
你确实有一个内存限制,因此将所有内容放入数组可能根本不提供解决方案。如果你处理大型数据库,缓存是唯一的选择,但你需要首先确定数据的可接受新鲜度持续时间。 - bcosca
2
在这种情况下,双方都没有明显的优势(一个5000行的整数数组会占用相当多的内存,但不是荒谬的数量),而数组操作的开销可能会被TCP开销抵消。因此,我认为你处于最佳状态,两者都差不多。如果数据量再多一点(比如50k+行),数据库会更快。如果数据量再少一点(比如1k行),PHP可能会更快。所以我认为速度不是主要问题... - ircmaxell
1
嗯,这也可能取决于脚本。一般来说,这取决于服务器的内存限制以及脚本将在哪里使用。您能描述更多细节吗?对于数据库来说,5k是一个相当小的数字,即使它是MySQL。另一方面,如果您的DB服务器驻留在不同的机器上,这可能会成为一个问题。我会选择DB解决方案,但尝试优化查询数量。 - Tomasz Struczyński
这取决于许多因素。例如,如果你有数百万行数据,最好坚持使用数据库。 - sanmai
显示剩余2条评论
4个回答

1

听起来你在代码中重复了一个唯一约束...

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

不,我需要在我的算法中检查它。 - Jaroslav

1

我必须同意 #2 是你最好的选择。当使用 LIMIT 1 查询时,MySQL 会在找到第一个匹配项时停止查询。确保你打算搜索的列已经建立索引。


0

你需要检查的次数与数据库中存储的值的数量相比如何?如果是1:100,那么每次在数据库中搜索可能更好,如果比这个数量少,那么预加载列表会更快。你测试的结果如何?

然而,即使比率足够低以至于加载整个表格更快,这将占用内存,并且可能导致其他所有操作变慢。

因此,我建议不要全部加载到内存中。但是,如果可以的话,请批量检查以最小化对数据库的往返次数。

C.


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接