2011-06-21 59 views
2

我有一个包含三个字段的数据库(MySQL)表:id,score和percent。SQL语句中计算的速度

长话短说,我需要做的每一个看起来像这样的记录计算:

(得分* 10)/(1 - 百分比)=价值

然后我需要使用在我的代码和ORDER BY字段中都是值。编写SQL不是我的问题 - 我只是担心这个声明的效率。在我的SQL语句中做这种计算是最有效的资源利用方式,还是我会更好地获取数据,然后通过PHP进行数学计算?

如果SQL是最好的办法,是否有任何提示,我可以记住保持我的SQL拉尽可能快?

更新1:只是为了澄清一些事情,因为它看起来像许多答案都假设不同:分数和百分比都会不断变化。实际上,几乎每次用户与应用程序交互时,这些字段都会改变(这些字段实际上与用户相关联,顺便说一句)。至于记录的数量,现在它非常小,但我想要为约200万条记录(用户)的目标集合进行缩放。在任何给定时间,我只需要20个记录,但我需要它们成为按此计算值排序的前20条记录。

+1

您可以使用此值将另一个字段添加到数据库中,在添加或更新数据时计算它。你有基准测试需要多长时间? – 2011-06-21 20:21:20

+0

使用MySQL的“解释”函数来查看时间执行。 – FinalForm

回答

4

这听起来像这个计算值是在您的业务领域的固有含义;如果是这种情况,我会计算一次(例如创建记录时),并像使用普通字段一样使用它。这是实现您想要的最有效的方法 - 插入或更新时的额外计算对性能影响最小,从此您不必担心计算的是谁。 缺点是您必须更新“插入”和“更新”逻辑才能执行此计算。我通常不喜欢触发器 - 它们可能是不可逾越的错误的来源 - 但这是我认为它们的一种情况(http://dev.mysql.com/doc/refman/5.0/en/triggers.html )。

如果由于某种原因你不能这样做,我会建议在数据库服务器上这样做。这应该是相当活泼的,除非你处理的记录数量非常大;在这种情况下,“排序”将是一个真正的性能问题。如果你在PHP端执行相同的逻辑,这将是一个更大的性能问题 - 当然,从性能角度来看,数据库往往是瓶颈,所以影响更大。 如果你正在处理大量的记录,你可能只需咬下子弹,并与我的第一个建议。

如果不是需要按计算进行排序,您也可以在PHP端执行此操作;然而,在PHP中对数组进行排序并不是我想要为大型结果集所做的事情,而且在数据库中进行排序似乎很浪费(这很好)。

所以,在这一切之后,我的实际建议归结为:

  • 做可以工作
  • 测试最简单的事情无论是速度不够快你 项目的约束范围内
  • 如果不是,迭代重构为更快的解决方案,重新测试
  • 一旦你达到“足够好”,继续前进。

基于编辑1

你已经回答了你自己的问题,我认为 - 返回(最终)2万行到PHP,才发现前20名的记录(计算后的“价值“一个接一个)会非常慢。所以在PHP中计算真的不是一种选择。

所以,你要在服务器上计算它。我的建议是创建一个视图(http://dev.mysql.com/doc/refman/5.0/en/create-view.html),它有SQL来执行计算;使用200,200K和2M记录对视图的性能进行基准测试,并查看它是否足够快。

如果2M用户/记录的速度不够快,您可以随时创建一个常规表格,在您的“值”列中有一个索引,而在您的客户端代码中相对较少需要更改;您可以通过触发器填充新表,并且客户端代码可能永远不会知道发生了什么。

+0

这听起来像只是添加另一个数据库字段可能是答案。这个领域将会发生很大的变化,这就是为什么我首先想到在飞行中计算它会更好,但现在我有第二个想法。我在我的问题中提供了一些更新的信息:这是否有助于缩小某种解决方案的范围? – jwegner

0

测试一下,让我们知道性能结果。我认为这将取决于结果集中的数据量。对于SQL位,只要确保where子句有一个覆盖索引。

0

你在哪里做数学不应该太重要。无论哪种方式,这都是同样的基本操作。现在,如果MySQL在与您的PHP代码不同的服务器上运行,那么您可能会关心哪个CPU进行计算。您可能希望SQL服务器执行更多“艰苦的工作”,或者您可能希望离开SQL服务器执行“仅SQL”,并将数学逻辑移至PHP。

另一个考虑因素可能是带宽使用(如果MySQL与PHP不在同一台机器上运行) - 您可能希望MySQL返回哪个表单更短,以便使用更少的网络带宽。

但是,如果它们都在同一个物理硬件上,那么从CPU使用率的角度来看,它可能没有明显的区别。

我会提供的一个提示是对原始值(百分比)执行ORDER BY而不是计算值 - 这样MySQL可以使用百分号列上的索引 - 它不能使用索引计算值。

0

如果你有越来越多的记录,你的脚本(和它的内存)将会比mysql更快地达到它的极限。您是否打算取回所有记录? 一般而言,Mysql会更快。 我不明白你将如何使用在PHP中计算的值在ORDER BY之后。如果你打算在PHP中进行排序,它会变得更慢,但这一切都取决于你正在处理的记录数量。

1

在做数学数据库的效率会更高因为发送数据从数据库中来回的客户会比简单的表达慢无论客户端是多么快,多么慢数据库。

+0

他的查询不涉及任何“来回”..他只会发送一次数据。此外,您声称“不管客户端速度有多快,数据库速度有多慢”都没有区别,只是错误。在他的情况下,这可能是真的,但“不管”仅仅是夸大其词。假设他想计算MD5总和......这是一个非常复杂的操作,无法在SQL语句中轻松表达(当然,它可能在存储过程中,在大多数数据库引擎中)。 – Flimzy

+0

我的意思是“通过管道将数据发送到客户端”与“几种算术运算”相比较。我不是在谈论因素分析大素数:)希望澄清。 –