SQL语句中的计算速度

| 我有一个包含三个字段的数据库(MySQL)表:id,score和percent。 长话短说,我需要对每条记录进行计算,如下所示: (得分* 10)/(1-百分比)=值 然后,我需要在代码中和ORDER BY字段中都使用该值。编写SQL并不是我的问题-我只是担心此语句的效率。是在我的SQL语句中执行该计算最有效地利用资源,还是最好先获取数据然后通过PHP进行数学运算? 如果SQL是执行此操作的最佳方法,那么有什么我可以记住的技巧可以使我的SQL拉取尽可能快? 更新1:只是为了澄清一些事情,因为似乎许多答案的假设都不同:得分和百分比都将不断变化。实际上,几乎每次用户与应用程序交互时,这些字段都会更改(这些字段实际上已链接到用户,顺便说一句)。 就记录数而言,目前它很小,但是我希望扩展到约200万条记录(用户)的目标集。在任何给定时间,我只需要20条记录,但我需要将它们作为按此计算值排序的前20条记录。     
已邀请:
        听起来这个计算值在您的业务领域中具有内在的意义;如果是这种情况,我将对其进行一次计算(例如,在创建记录时),并将其像任何普通字段一样使用。到目前为止,这是实现所需目标的最有效方法-插入或更新时进行额外的计算对性能的影响最小,从那时起,您不必担心在哪里进行计算。 缺点是您必须更新\“插入\”和\“更新\”逻辑才能执行此计算。我通常不喜欢触发器-它们可能是难以渗透的错误的源头-但这是我考虑使用它们的情况(http://dev.mysql.com/doc/refman/5.0/zh/triggers .html)。 如果由于某种原因您无法执行此操作,建议您在数据库服务器上执行此操作。除非您要处理大量的记录,否则这应该非常简单。在这种情况下,“排序依据”将是一个实际的性能问题。如果您在PHP端执行相同的逻辑,那么这将是一个更大的性能问题-但是从性能的角度来看,数据库往往是瓶颈,因此影响更大。 如果您要处理大量记录,则可能只需要硬着头皮接受我的第一个建议即可。 如果不需要按计算进行排序,则也可以在PHP方面进行;但是,对于大型结果集,我不想在PHP中对数组进行排序,并且不对数据库进行排序似乎很浪费(这在这种情况下是很不错的)。 因此,毕竟,我的实际建议可以归结为: 做最简单的可行的事情 在您的约束范围内测试它是否足够快 项目 如果不是,则迭代重构为更快的解决方案,然后重新测试 一旦达到“足够好”,继续前进。 基于编辑1: 我认为,您已经回答了自己的问题-(最终)向PHP返回200万行,仅找到前20条记录(在逐一计算“值”之后),这会变得异常缓慢。因此,用PHP计算实际上不是一个选择。 因此,您将在服务器上进行计算。我的建议是创建一个视图(http://dev.mysql.com/doc/refman/5.0/en/create-view.html),该视图具有执行计算的SQL。使用200、200K和2M记录对视图的性能进行基准测试,看看它是否足够快。 如果要达到200万用户/记录的速度还不够快,您总是可以创建一个常规表,在“值”列上有一个索引,并且几乎不需要更改客户端代码;您可以通过触发器填充新表,而客户端代码可能永远都不知道发生了什么。     
        在数据库中进行数学运算将更加有效,因为无论客户端有多快,数据库有多慢,从数据库来回向客户端发送数据都比简单的表达式慢。     
        测试一下,让我们知道性能结果。我认为这将取决于结果集中的数据量。对于SQL位,只需确保where子句具有覆盖索引即可。     
在哪里做数学应该不太重要。两种方法都是相同的基本操作。现在,如果MySQL在与PHP代码不同的服务器上运行,那么您可以关心哪个CPU进行计算。您可能希望SQL服务器完成更多的“艰苦工作”,或者希望让SQL服务器仅执行“仅SQL”,然后将数学逻辑移至PHP。 另一个考虑因素可能是带宽使用情况(如果MySQL与PHP不在同一台计算机上运行)-您可能希望MySQL返回以较短的形式返回,以使用较少的网络带宽。 但是,如果它们都在同一物理硬件上,那么从纯粹的CPU使用率的角度来看,这可能并没有明显的区别。 我要提供的一个提示是对原始值(百分比)而不是对计算值进行ORDER BY-这样,MySQL可以在百分比列上使用索引-在计算值上不使用索引。     
        如果记录数量不断增加,则脚本(及其内存)将比mysql更快达到其极限。您是否打算获取所有记录? 一般而言,MySQL会更快。 我不知道如何使用ORDER BY之后在php中计算的值。如果您打算用php进行排序,它会变得更慢,但是这完全取决于您要处理的记录数。     

要回复问题请先登录注册