php - SQL语句的计算速度

标签 php mysql performance

我有一个包含三个字段的数据库 (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/

相关文章:

php - 如何优化 MySQL 游戏排行榜 - 大量子查询问题

php - 谁能向我解释一下 max_input_nesting_level 的用途以及嵌套深度是多少?

php - Twig 模板引擎中具有多个元素的 Foreach 循环

ruby-on-rails - Ruby .each 效率

android - 有什么方法可以解决在Android中运行同一个应用程序的2个实例?

mysql - 如何根据一列的值过滤另一列?

php - Laravel 电子邮件队列有效但不发送

php - 删除插入mysql时的空格

php - 比较 MYSQL 时间戳以检索以特定单位传递的时间

mysql - LOAD DATA INFILE 不导入到mysql数据库