脚本太慢,如何避免多次运行相同的查询


script is too slow how can I avoid running the same queries multiple times?

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

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

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

    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时每个只运行一次? 有没有另一种方法可以考虑我没有想到?

感谢您的帮助!

是的,这将导致您的查询只运行一次。如果你想确保它们每个会话运行一次,而不是每次都手动将结果缓存在变量中,你可以查看具有一些缓存能力的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。