我经常使用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) 的一部分完成;
- 该身份验证和连接步骤(至少)是到服务器的一次往返(忽略持久连接);
- 您在客户端执行查询;
- 该查询被发送到服务器;
- 服务器必须确定如何执行查询;
- 如果服务器先前已执行过查询,则执行计划可能仍在查询缓存中。如果不是,则必须制定新计划;
- 服务器按照给定的方式执行查询并将结果返回给客户端;
- 该结果将包含一些与实现相关的行缓冲区。它可能是 100 行或更多或更少。每行返回所有列;
- 当您获取更多行时,客户端最终会向服务器请求更多行。这可能是在客户端耗尽时发生的,也可能是抢先完成的。同样,这取决于实现。
所有这一切的想法是最大限度地减少到服务器的往返而不发回too much不必要的数据,这就是为什么如果您请求一百万行,您将无法立即将它们全部返回。
LIMIT 子句(或事实上的任何子句)将修改结果集。
最后,(7)很重要,因为SELECT * FROM table WHERE a = 'foo'
and SELECT * FROM table WHERE a = 'bar'
就数据库优化器而言,这是两个不同的查询,因此必须分别为每个查询确定执行计划。但是参数化查询(SELECT * FROM table WHERE a = :param
)具有不同参数的是一个查询,并且只需要计划一次(至少直到它脱离查询缓存为止)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)