大型PHP数组 vs MySQL数据库?

8
我在思考是应该使用一个大的多维数组还是MySQL数据库。我正在为一位客户开发,这家公司有很多产品。在这个多维数组中,我将包含每个单独产品的产品标题、描述、图片链接和类别。
我的客户可能有1000多个产品。我已经研究了其他类似的问题,并且很多人说使用数组或许更快,但是没有一个涉及到这种规模的数组。
就我个人而言,我宁愿使用数组,因为我对MySQL的知识非常有限,但是如果这意味着要牺牲大量速度,那么我宁愿使用数据库。您认为哪个选项更适合我的情况?

1
这是学习MySQL的机会,抓住它吧!(是的,它比一个大数组好多了) - Wesley Murch
2
在一个数组中有1000个项目,这并不算什么,除非你正在使用一个极度内存受限的系统。 - Marc B
3
使用数据库!所有的数据库引擎已经实现了常见的方法(如“JOIN”)和优化。如果您计划使用数组,那么您需要自己在 PHP 中编写这些内容。 - ComFreek
4个回答

9
其他答案是正确的,但理由不对。在PHP数组中保存数据比从数据库中获取要快得多,即使数据集在内存中被缓存。问题在于,在正常的PHP架构中,每个请求都由一个单独的进程处理。因此,需要访问数据的每个请求都必须将整个数据集加载到内存中。这需要时间。与从数据库中检索项相比,执行此操作更加昂贵的点取决于许多不同的因素,但粗略的经验规则是在100条记录左右。有些应用程序使用这种模型很有意义,但它们依赖于非常小的数据量和对数据进行控制的过程。接下来的问题是,您可能希望记录一些库存交易-这意味着更改数据-并且这意味着序列化访问以确保2个单独的事务不会同时发生。在PHP中实现这是不可能的(除非有专用守护程序进行仲裁),而不会发生死锁。如果您正在为实现代码收费,那么显然尝试在内存中实现这一点是非常非常糟糕的想法。

我正在考虑使用数据库代替多维对象数组,只是为了能够使用数据库操作来管理我的游戏。因此,当 Android 应用程序运行时,每个数据库操作都必须与设备上的物理内存进行交互,而不是应用程序所分配的 RAM 内存?当你每秒钟执行数百次交互时,似乎数据库会严重拖慢游戏速度。 - Androidcoder
有任何支持这个说法的来源/证据吗?我有一个永远不会改变且总是以其全部查询的数组。然而,该数组具有超过10,000个元素。我保存数组的文件大约为2MB。我猜在某些时候PHP必须将整个文件加载到内存中也会有一定的成本?相比之下,从数据库中加载10,000条记录到数组中是否有任何好处?我知道实质上mysql也使用文件系统,但是否有理由认为mysql以更高效的方式执行此操作? - Jules Colle
自己来测量吧。 - symcbean

7

就我个人而言,我会选择使用数据库。以下是我的理由。

使用数据库会导致连接时间、通信和查询时间等方面的性能损失,但是它也带来了一些好处。

  1. 更好、更容易的操作。
  2. 稳定性、安全性和云能力。
  3. 因为处理大量数据将变得非常麻烦。

此外,使用数据库可以让裸眼查看数据更加容易。


2
随着数组的增长,通过数据库索引查找数据比循环遍历大型数组更快。 - gwc
感谢您对此事的所有想法。我已决定使用MySQL数据库。从长远来看,这似乎更容易维护,因为我们可能会不断添加更多的产品。再次感谢。 - Franco Selem
很高兴能够提供帮助。如果您有任何关于通过php与MYSQL交互的问题,请随时问我。我也可以提供一些工作样例。我是这个网站的新手(回答问题,但已经使用了一段时间),我不确定您是否可以在此处发送消息,如果不能,请通过电子邮件联系我jjonesdesign@gmail.com - jjonesdesign

3
使用数组的代码会更简单,而且不会有 MySQL 数据库的复杂性。如果数据是静态的,并且没有其他用途或用户使用该数据,则数组就可以了。
另一方面,如果数据需要更改,或者该数据对于其他业务功能有用,那么使用 MySQL 数据库是正确的选择。

3
你知道每次页面加载时,所有的“记录”都需要被评估并加载到RAM中,才能将HTML发送给浏览器,对吗? - SparK
2
你知道每次页面加载时,PHP代码都会被加载到RAM中并进行解释,对吧?你知道如果他使用MySQL数据库,那么每次页面加载时都必须加载MySQL驱动程序,并建立与数据库的连接,必须将查询发送到数据库,并将结果集检索到RAM中(如果数据库不在同一台机器上,则需要通过网络传输),然后才能将HTML发送到浏览器,对吧?使用MySQL可能会增加所需的RAM量,并增加将要执行的指令数量;这不是免费的。 - spencer7593
4
告诉别人不要使用数据库是制造维护噩梦的好方法。不使用数据库没有性能上的好处,特别是当这个人有1000多个产品的时候,更是如此。即使只有两个产品,他也应该期望公司增加目录并使用数据库。这是常识。而且,用SQL查询一个项目所使用的内存量与存储1000多个对象所使用的内存量是不相等的。 - developerwjk

2

让我们稍微谈一下内存消耗。

在PHP中,一个单独的数组元素会消耗144个字节的数据,不包括任何字符串文本(这需要额外的空间)。

如果有1000个元素的数组,则使用144,000个字节加上文本字符串 - 这看起来并不是很多。

但是,您不能仅使用一个值创建有用的数据结构,因此您的1000个元素可能是具有子元素的数组。假设每个数组只有10个元素。每个元素的数组将占用1440个字节,乘以1000个元素。现在我们已经接近1,440,000个字节了。如果考虑到文本和更复杂的子结构,它会变得更大。

此外,该数组必须在每个同时请求中都存在于内存中。而且必须以某种方式加载。反序列化数组需要相当数量的CPU功率。

最后:使用数据库!将所有数据推送到内存中没有任何好处。


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