gpt4 book ai didi

php - PHP/MySQL 数据库查询究竟是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 06:55:36 25 4
gpt4 key购买 nike

我经常使用 MySQL,但我一直想知道它到底是如何工作的 - 当我得到肯定的结果时,数据到底存储在哪里?比如我这样写:

$sql = "SELECT * FROM TABLE"; 
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result)) {
echo $row->column_name;
}

当返回一个结果时,我假设它保存了所有数据结果,或者它是在一个片段中返回并且只返回它被要求的地方,比如 $row->column_name?

或者即使您只想要 $result 中的一列,它真的会返回每一行数据吗?

此外,如果我使用 LIMIT 进行分页,即使数据库已更新,它是否仍保留原始(旧)结果?

最佳答案

细节取决于实现,但一般来说,结果是缓冲的。对数据库执行查询将返回一些结果集。如果它足够小,则可能会在初始调用时返回所有结果,或者在迭代结果对象时可能会返回一些结果并返回更多结果。

这样想序列:

  1. 您打开一个到数据库的连接;
  2. 可能会有第二次调用来选择数据库,或者它可能作为 (1) 的一部分完成;
  3. 身份验证和连接步骤(至少)是到服务器的一次往返(忽略持久连接);
  4. 您在客户端上执行查询;
  5. 该查询被发送到服务器;
  6. 服务器必须确定如何执行查询;
  7. 如果服务器之前执行过查询,则执行计划可能仍在查询缓存中。如果不是,则必须制定新计划;
  8. 服务器按照给定的方式执行查询,并将结果返回给客户端;
  9. 该结果将包含一些依赖于实现的行缓冲区。它可能是 100 行或更多或更少。为每一行返回所有列;
  10. 随着您获取更多行,客户端最终会向服务器请求更多行。这可能是在客户端用完时,也可能是抢先完成的。同样,这取决于实现。

所有这一切的想法是尽量减少与服务器的往返行程,而不会发回太多不必要的数据,这就是为什么如果您请求一百万行,您不会立即将它们全部取回.

LIMIT 子句——或实际上的任何子句——将修改结果集。

最后,(7) 很重要,因为 SELECT * FROM table WHERE a = 'foo'SELECT * FROM table WHERE a = 'bar' 是两个不同的查询就数据库优化器而言,必须为每个单独确定执行计划。但是具有不同参数的参数化查询(SELECT * FROM table WHERE a = :param)是一个查询,只需要计划一次(至少直到它从查询缓存中消失)。

关于php - PHP/MySQL 数据库查询究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com