我正在尝试找出使用PHP向MySQL数据库发送多个查询的最有效方法。现在我正在做两个单独的查询,但我知道有更有效的方法,比如使用mysqli_multi_query
。 mysqli_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;
}
答案 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()
为什么不尽可能多地使用数据库引擎,它能够很好地处理复杂的解决方案而且我们不会使用它。