2011-11-25 77 views
1

在MySQL程序,我不知道这是一个愚蠢的问题,但我有这个两个疑惑也许你可以帮我清除出:MYSQL优化和设计规则:PHP方法VS本地主机

如果我的数据库和Web服务器位于同一主机上,是否有任何相关优势,使我的过程有条件地从SQL数据库过程中的表中选择(使用多个SQL查询)元素,而不是仅在Web服务器端脚本中实现它们(在我的案例PHP)的方法与其他的Web应用程序代码?

其次,甚至更重要的是:我是否违反了任何设计规则?

更具体地说,我做了一个PHP脚本,根据各行的前一个选择的数量确定的概率密度函数,这是这样的,从表中选择一个随机行:

function acceptation_rejection_method($link,$tablename,$column,$condition="") 
{ 
    $max=get_col("max(".$column.")",$tablename,$link,$condition); 
    $min=get_col("min(".$column.")",$tablename,$link,$condition); 
    $bar_value=mt_rand($min,$max); 

    $count=get_nelements($tablename, $link,"where ".$column."<=".$bar_value); 
    $selected_row=get_row(mt_rand(0,$count-1), $tablename, $link,"where " 
    .$column."<=".$bar_value); 
    return $selected_row; 
} 

我函数实现接受拒绝方法(http://en.wikipedia.org/wiki/Acceptance-rejection_method),我的问题是:考虑到我的数据库和我的Web服务器位于同一主机上,是否有任何改进将该脚本重写为返回行的SQL代码? (假设我的应用程序的所有用户都在不断地使用它,就像每个请求中的一样)

+0

看来你没有清理你的$ column,$ table和其他变量 - 这是一个突破一些设计规则肯定 –

+0

symcbean是正确的,你在这里专门讨论的模型 –

+0

MVC提到删除流行的索赔,在调用mysql_query之前在get_nelements,get_row和get_col中执行清理,但是也许我应该在$ bar_value之前检查$ count以及$ min和$ max值。感谢提及 – NotGaeL

回答

1

如果我正确地解释你的问题,你想知道你是否应该编码您接受/拒绝算法成一个纯粹的数据库功能,或者你在这里所做的是“正确的”,无论从建筑和表现的角度来看。从性能的角度来看,如果有一种方法可以将查询表示为单个SQL语句,那么它可能会比当前的实现更快,但是(假设列是索引的),可能并不是那么多更快。

你可以,当然,创建一个存储过程 - 但它看起来像你在多个表和列运行这一点,所以你最终有很多的存储过程。

存储过程有优点和缺点,但在这种情况下,我会说,他们使应用更加脆弱。再次,我怀疑你是否会看到巨大的性能影响。

建筑上,我觉得你在做什么很可能是干净的解决方案 - 你背后抽象的单一方法的算法。

+0

感谢您的洞察力,我对SQL程序和SQL的知识一般都非常有限,而且我不知道存储过程方法何时是最聪明的解决方案(尽管如此,我正在努力学习更多关于此方面的知识他们看到了我的需求,只是想知道哪种解决方案在一般情况下更好,针对我的情况,并且您非常清楚地回答)。 – NotGaeL

1

我怀疑形式从同一个源请求相同的数据无所谓。

假设我的应用程序的所有用户在每次请求

经常使用它,像几乎一次,然后你可能要考虑不断变化的办法。

对不起,我与自己矛盾。

首先,您必须对您的代码进行配置并查看是否有任何问题。

只有如此,那么您可能想要考虑改变方法。假设您可以一次请求所有数字,随机化它们并将其存储在内存缓存中。然后只需要逐一请求,使用后删除。刷新排气。

+0

嗯,它实际上并没有很大的麻烦,只是想知道如果它适用与否。一次完成所有请求在这种情况下并不是有用的,我肯定会采纳这个建议并将其应用于我现在正在处理的另一个案例。 – NotGaeL

1

在一个简单的MVC架构的设计,其中数据库和Web服务器在同一台主机

嗯吗? MVC是一种设计模式,不是系统/服务架构。

是那里把我的程序有条件地选择SQL数据库程序中(使用多个SQL查询)元素从表而不是只在一个web服务器端脚本实现它们的任何相关利益

首先,对于相同的人群,无论您是在查看整个样本还是只是一个子集,都不应该需要“多个SQL查询”。即无论您如何实施它,您的算法都存在缺陷。

其次,使用脚本你拖大量的数据库和PHP脚本,这是一个开销之间的数据。您正在使用PHP处理大量数据。 PHP没有明确的设计形式来处理大数据集--SQL和PL/SQL。如果你在数据库上做了尽可能多的处理,那么你的应用程序应该运行得更快,代码更少。

+0

好,然后更改为第一行的“在一个简单的MVC设计模式设计...”(对不起,这不是一个借口,但英语不是我的母语,因此麻烦)其实,使用脚本我做4个querys ,其中3个返回一个数字,另一个返回选定的行,所以PHP需要处理的“大量”数据是3个数字(我是对吗?),实际开销是3个请求的数量,而3个数据是真的短答案。不知道这是否是一个效率漏洞,但无论如何,对于操纵查询输出大量数据的最常见情况来说,肯定会有一些考虑。 – NotGaeL