脚本太慢我怎么能避免多次运行相同的查询?

时间:2012-06-29 14:38:59

标签: php mysql

我有一个运行时间太长的脚本,我一直在努力优化它以加快速度。我知道的一件事是花费额外的时间是我必须多次运行相同的查询。我希望能够存储该查询的结果(不将其写入数据库),以便我可以在以后引用它的值,而无需再次运行查询。

我正在大大简化下面的脚本,但希望这会给你一个想法。

假设我有两个函数,每个函数都返回一个值:

    function a(){
          $query = "SELECT SUM(price) FROM table_1 WHERE zip='$this->zip'"; 
          $result = mysql_query($query) or die(mysql_error());
          while($row = mysql_fetch_array($result)){
          return $row['SUM(price)'];
    }
    function b(){
          $query = "SELECT SUM(price) FROM table_2 WHERE zip='$this->zip'"; 
          $result = mysql_query($query) or die(mysql_error());
          while($row = mysql_fetch_array($result)){
          return $row['SUM(price)'];
    }

假设函数a()返回值10,函数b()返回值5

现在,假设我的脚本是这样的:

    if (function a() > 5) { echo 'it is greater than 5!' }
    if (function a() < 5) { echo 'it is less than 5!' }
    if (function b() == 5) { echo 'it equals 5!' }
    if (function b() > 10) { echo 'it is not greater than 5!' }

如果我理解正确,上面的脚本会导致我的数据库有4个单独的查询。可以存储每个查询的初始运行?我想到的一件事就是:

    $a = function a();
    $b = function b();

然后让我的脚本像这样:

    if ($a > 5) { echo 'it is greater than 5!' }
    if ($a < 5) { echo 'it is less than 5!' }
    if ($b == 5) { echo 'it equals 5!' }
    if ($b > 10) { echo 'it is not greater than 5!' }

这会导致查询在我定义$ a和$ b时仅运行一次吗?还有另一种方法可以考虑我没想到的吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

是的,这会导致您的查询只运行一次。如果你想确保它们每个会话运行一次而不是每次都在变量中手动缓存结果,你可以查看具有一些缓存能力的ORM,或者在每个函数中使用静态变量:

function a() {
  static $cached_result;
  if (!is_null($cached_result) return $cached_result;

  $query = "SELECT SUM(price) FROM table_2 WHERE zip='$this->zip'"; 
  $result = mysql_query($query) or die(mysql_error());
  while($row = mysql_fetch_array($result)){
    return $cached_result = $row['SUM(price)'];
  }
}

如果您不想使用ORM,您至少应该围绕数据库访问编写自己的一系列包装函数,而不是在每个函数中手动调用mysql_query。应用程序应该只有一个点通过mysql_*函数系列触及数据库。这种隔离变化;如果您首先在数据库访问周围实现了一个小包装器,那么现在只需要更改一个地方就可以放弃使用过时的mysql_query函数来支持PDO。