这个问题对某些人来说似乎太基本了,但请耐心等待,因为我处理了不错的数据库编程已经有一段时间了。
我有一个算法,我需要在PHP / MySQL中编程才能在网站上工作。它在一个对象数组上迭代地执行一些计算(它根据对象的属性对对象进行排名)。在每次迭代中,算法会在所有集合中运行几次,从整个集合的不同位置访问各种数据。该算法需要几百次迭代才能完成。该数组来自数据库。
我看到的直接解决方案是获取数据库查询的结果并为查询的每一行创建一个对象,将对象放入一个数组并将数组传递给我的算法。
但是,当我必须使用数千个项目的数组时,我关注这种解决方案的功效,因为我所做的实际上是将查询结果镜像到内存中。
另一方面,在算法的每次迭代中多次进行数据库查询似乎也是错误的。
所以,我的问题是 - 对于像这样的问题,正确的架构解决方案是什么?将查询结果镜像到内存是否可以?如果没有,这是在这种算法中使用查询结果的最佳方法吗?
谢谢!
更新:我能想到的最接近的问题是搜索引擎对搜索结果的排名 - 我需要做类似的事情。每个结果都表示为一行数据库,并且在计算排名时会考虑该集合的所有结果。
答案 0 :(得分:2)
别忘了,过早优化是万恶之源。试一试将所有内容复制到内存中。如果使用太多内存,则优化内存。
答案 1 :(得分:1)
这实际上取决于手头的情况。这可能很少需要做这样的事情,但很难根据你给出的信息来判断。
尝试尽可能地隔离数据。例如,如果您需要对循环迭代中没有数据依赖性的数据执行一些独立操作,您可以编写一个查询来更新受影响的行,而不是将它们全部加载到内存中,只是将它们写回来
简而言之,它可能是可以避免的,但在您向我们提供更多信息之前很难说清楚:)
答案 2 :(得分:1)
记忆似乎是最好的方式 - 如果你可以扩大规模来满足它。否则,您将不得不修改您的算法,以便使用分而治之的方法 - 执行类似合并排序的操作。
答案 3 :(得分:1)
如果您正在对数据库进行查询,那么当结果返回时,它们已经“镜像到内存”。当您使用mysql_fetch_assoc(或equiv)获得结果时,您将获得副本。只需将其用作缓存。
答案 4 :(得分:0)
一个对象的计算是依赖于另一个对象,还是它们都是独立的?如果它们是独立的,您可以从数据库中加载少量行,并在描述时将它们转换为对象。然后对这些迭代运行数百次迭代,然后输出该块的结果。然后,您将进入下一个项目块。
这样可以减少内存使用量,因为您只处理少量项目而不是整个数据集,并且避免在数据库上运行多个查询。
SQL关键字LIMIT和OFFSET可以帮助您逐个单步执行数据。
答案 5 :(得分:0)
使用MySQL编写排名查询也是可能的,您只需要稍微使用用户定义的变量。如果您将提供一些输入数据以及您将要实现的结果,那么回复将更加详细
答案 6 :(得分:0)
您可以使用cron作业进行排名,比如每天,每小时或其他任何需要,然后将项目排名保存到其行中的字段中吗?
当您调用行时,您可以按排名字段对它们进行排序。