我正在尝试构建一个为长时间运行的页面加载的进度条(是的索引是明显的解决方案,但目前数据集/模式禁止分区/正确索引)所以我计划在查询注释中使用 GUID/uniqueID 来跟踪使用 SHOW_FULL_PROCESSLIST 的进度通过 ajax - 但关键在于顺序查询是否由 php 按顺序执行,有人知道吗?
3 回答
MySQL 作为数据库服务器使用多个线程来处理多个正在运行的查询。它在收到来自客户端的查询(即 PHP 连接或 ODBC 连接等)时分配一个线程。
但是,既然您提到了 mysql_query,我认为您可能会想到两件事:
如果你多次调用 mysql_query() 来传递各种命令,那么 MySQL 将在前一个查询完全执行后传递每个查询并将结果返回给 PHP。因此,当然 MySQL 似乎会按顺序工作,尽管实际上是 PHP 正在等待向 MySQL 发送一个查询,直到一个查询完成。
在 MySQL5 和 PHP5 中,有一个名为 (
mysqli_multi_query()
) 的函数,您可以使用它一次将多个查询传递给 MySQL,而无需 PHP 等待 1 个查询结束。该函数将在同一个结果对象中一次返回所有结果。MySQL 实际上将使用多个线程一次运行所有查询,并且在这种情况下等待时间大大减少,并且您还倾向于更好地使用可用的服务器资源,因为所有查询都将作为单独的线程运行。
正如巴贝奇曾经说过的那样,“我无法正确理解会引发这样一个问题的那种混乱的想法。” 对 的调用mysql_query
,与对任何其他函数的调用一样,按照它们在程序流中到达的顺序执行。
文件中的顺序大多无关紧要。重要的是执行顺序。
<?php
myCmdFour();
myCmdTwo();
myCmdThree();
myCmdTwo();
function myCmdTwo() {
mysql_query(...);
}
function myCmdThree() {
mysql_query(...);
}
function myCmdFour() {
mysql_query(...);
}
myCmdFour();
myCmdThree();
myCmdTwo();
myCmdTwo();
?>
尽管任何拥有类似 PHP 文件的人都需要认真重新考虑。