我有一个包含三个字段的数据库 (MySQL) 表:id、分数和百分比。
长话短说,我需要对每条记录进行计算,如下所示:
(分数 * 10)/(1 - 百分比)= 值
然后我需要在代码中和 ORDER BY 字段中使用该值。编写 SQL 不是我的问题 - 我只是担心这个语句的效率。在我的 SQL 语句中进行计算是对资源最有效的利用,还是我抓取数据然后通过 PHP 进行数学计算会更好?
如果 SQL 是最好的方法,那么我是否可以记住一些技巧来保持 SQL 拉取速度尽可能快?
更新 1:只是为了澄清一些事情,因为似乎许多答案的假设不同:分数和百分比都会不断变化。实际上,几乎每次用户与应用程序交互时,这些字段都会发生变化(顺便说一句,这些字段实际上链接到用户)。
就记录数而言,目前它非常小,但我希望能够扩展到大约 200 万条记录(用户)的目标集。在任何给定时间,我只需要 20 条左右的记录,但我需要它们是按此计算值排序的前 20 条记录。
最佳答案
听起来这个计算值在您的业务领域具有内在意义;如果是这种情况,我会计算一次(例如在创建记录时),然后像任何普通字段一样使用它。这是迄今为止实现您想要的最有效的方法 - 插入或更新时的额外计算对性能的影响最小,从那时起您不必担心谁在哪里进行计算。 缺点是您必须更新“插入”和“更新”逻辑才能执行此计算。我通常不喜欢触发器 - 它们可能是难以理解的错误的根源 - 但在这种情况下我会考虑它们(http://dev.mysql.com/doc/refman/5.0/en/triggers.html )。
如果由于某种原因你不能这样做,我建议在数据库服务器上这样做。这应该非常快捷,除非您正在处理大量记录;在这种情况下,“order by”将是一个真正的性能问题。当然,如果您在 PHP 端执行相同的逻辑,这将是一个更大的性能问题 - 但从性能角度来看,您的数据库往往是瓶颈,因此影响更大。 如果您正在处理大量记录,您可能只能硬着头皮接受我的第一个建议。
如果不是需要通过计算排序,在PHP端也可以这样做;然而,在 PHP 中对数组进行排序并不是我想要对大型结果集执行的操作,而且不在数据库中进行排序似乎很浪费(这在这方面很擅长)。
所以,毕竟,我的实际建议归结为:
- 做最简单可行的事情
- 测试它在您的限制内是否足够快 项目
- 如果没有,迭代重构为更快的解决方案,重新测试
- 一旦达到“足够好”,就继续前进。
基于编辑1:
我认为你已经回答了你自己的问题 - 返回(最终)200 万行给 PHP,却发现前 20 条记录(在逐一计算它们的“值”之后)会非常慢。所以用 PHP 计算确实不是一个选择。
所以,您将在服务器上计算它。我的建议是创建一个 View (http://dev.mysql.com/doc/refman/5.0/en/create-view.html),其中包含执行计算的 SQL;使用 200、200K 和 2M 记录对 View 的性能进行基准测试,看看它是否足够快。
如果在 200 万个用户/记录下速度还不够快,您始终可以创建一个常规表,并在“值”列上建立索引,并且在客户端代码中几乎不需要更改;您可以通过触发器填充新表,而客户端代码可能永远不知道发生了什么。
关于php - SQL语句的计算速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431463/