使用PHP多次查询mysql数据库的最有效方法是什么?

时间:2014-01-08 22:04:53

标签: php mysql mysqli

我正在尝试找出使用PHP向MySQL数据库发送多个查询的最有效方法。现在我正在做两个单独的查询,但我知道有更有效的方法,比如使用mysqli_multi_querymysqli_multi_query是最有效的方法还是有其他方法?

例如,我可以编写一个查询,将数据库中所有表中的所有数据放入PHP数组中。然后我可以使用PHP对数据进行排序,无论我需要什么数据,都只有一个查询...我可以将PHP数组放入会话变量中,这样用户就不会在该会话期间再次查询数据库。有道理吗?为什么不这样做而不是每次重新加载页面时创建一个新的查询?

在此找到资源真的很难,所以我只是在寻求建议。我计划在我正在构建的网站上拥有大量流量,因此我需要代码尽可能减少对服务器的压力。就表格大小而言,我们正在讨论,比方说最大的表中有3,000行。将它存储到一个大的PHP数组中是否可行(优点是客户端只在页面加载时查询数据库)?

$Table1Array = Array();
$Table1_result = mysqli_query($con,"SELECT * FROM Table1 WHERE column1 ='" . $somevariable . "'");
 while($row = mysqli_fetch_array($Table1_result))
  {


  $Table1Array[] = $row;

  } 


// query 2
$Table2Array = Array();
$Table2_result = mysqli_query($con,"SELECT * FROM Table2 LIMIT 5");
 while($row = mysqli_fetch_array($Table2_result))
  {


  $Table2Array[] = $row;

  }   

3 个答案:

答案 0 :(得分:2)

这里有一些事情需要解决,希望这有意义/有建设性......

  

mysqli_multi_query是最有效的方法还是其他方法   装置

这取决于您为给定页面/查询尝试执行的操作的细节。一般来说,使用mysql_multi_query不会获得太多性能,因为MySQL仍将执行您一个接一个地提供的查询。 mysql_multi_query的性能提升来自于PHP和MySQL之间的往返次数减少。如果两者在不同的服务器上,或者您一个接一个地执行1000个查询,这是一件好事。

  

例如,我可以编写一个放置所有数据的查询   将数据库中的所有表都放入PHP数组中。

只需。不,理论上你可以,但除非你有一个页面同时显示所有数据库内容,否则就没有必要了。

  

然后我可以使用PHP

对数据进行排序

如果您可以使用MySQL对数据进行排序/过滤,请执行此操作。操纵数据集是MySQL非常擅长的事情之一。

  

为什么不只是[将所有内容加载到会话中]而不是每次重新加载页面时都创建一个新查询?

因为数据集很大,并且每次向服务器发出请求时,会话数据都会从客户端传输。除了发送不必要的巨大请求外,这种方法还会带来哪些其他挑战呢?即如果在为此特定用户创建基于会话的缓存后,如果将额外数据添加到数据库,您会怎么做?如果数据的大小对于用户的会话而言太大会怎么样?如果我拒绝你的会话cookie,从而强迫怪物查询在每个请求上执行,那么我作为用户会有什么经验?

  

我计划在我正在建设的网站上拥有大量流量

我们都不是!正如上面的评论所暗示的那样,过早优化是一件坏事。在这个阶段,你应该集中精力让你的domain logic确定下来,并建立一个良好的,可维护的OO平台,作为进一步发展的基础。

答案 1 :(得分:1)

For example, I could just write a query that puts ALL the data from ALL the tables in 
the database into a PHP array. Then I could sort the data using PHP, resulting in having 
only one query no matter what data I needed...

我认为这会低效,因为你已经失去了数据库的价值。当您考虑优化时,mysql优于您可以编写的任何PHP代码。

此外,您说运行一个查询,将数据推送到用户的变量可能会减少资源,但这是真的吗?如果您有大量流量,并且此数据在会话变量中,那么如果当前有1000个用户登录,那么您的PHP服务器上将有1000个重复的整个数据库! - 你确定服务器有足够的内存吗?

我使用两种方法来运行多个查询:

$conn = mysql_connect("host", "dbuser", "password");

$query1 = "select.......";
$result1 = mysql_query($query1) or die (mysql_error()); // execute the query
while($row1 = mysql_fetch_assoc($result1))
{
    // fetch the results from the query
}

$query2 = "select.......";
$result2 = mysql_query($query2) or die (mysql_error()); // execute the query
while($row2 = mysql_fetch_assoc($result2))
{
    // fetch the results from the query i.e. $row2['']
}

mysql_close($conn); // Close the Database connection.

另一种方法是,如果有多个查询必须全部执行或根本不执行,则使用事务

你可以尝试一下。但是,如果唯一的原因是让1个查询认为它会更快,我会不这么认为。数据库中的优化是至关重要的,尤其是mysql

答案 2 :(得分:1)

如果我想在mysql数据库上执行多个查询,我会使用mysql存储过程,然后你所要做的只是从php发出一个简单的调用,一个过程的基本例子是:

DELIMITER $$
create procedure multiple_queries()

Begin
SELECT * FROM TBL1 WHERE 1;
SELECT * FROM TBL2 WHERE 2;
SELECT * FROM TBL3 LEFT JOIN ON TBL4 WHERE id= '121';
END $$

DELIMITER ;

在php中你可以简单地在括号中调用过程和与之关联的任何参数

CALL multiple_queries()

为什么不尽可能多地使用数据库引擎,它能够很好地处理复杂的解决方案而且我们不会使用它。

相关问题