我经常使用MySQL,但我总是想知道它是如何工作的 – 当我得到一个肯定的结果时,数据存储在哪里?例如,我这样写:
$sql = "SELECT * FROM TABLE";
$result = MysqL_query($sql);
while ($row = MysqL_fetch_object($result)) {
echo $row->column_name;
}
当返回一个结果时,我假设它保存所有数据结果,或者它是否在片段中返回,只返回它所要求的位置,如$row-> column_name?
或者,即使您只想在$result中使用一列,它是否真的会返回每一行数据?
最佳答案
细节是依赖于实现的,但一般来说,结果是缓冲的.对数据库执行查询将返回一些结果集.如果它足够小,所有结果可能会在初始调用时返回,或者某些结果可能会在迭代结果对象时返回更多结果.
原文链接:https://www.f2er.com/mysql/434139.html以这种方式思考序列:
>您打开与数据库的连接;
>可能有第二次调用选择数据库,或者可能是(1)的一部分;
>该认证和连接步骤(至少)一次往返服务器(忽略持久连接);
>您在客户端上执行查询;
>该查询被发送到服务器;
>服务器必须确定如何执行查询;
>如果服务器先前已执行查询,则执行计划可能仍在查询缓存中.如果不是,则必须创建新计划;
>服务器执行给定的查询并将结果返回给客户端;
>该结果将包含一些依赖于实现的行缓冲区.它可能是100行或更多或更少.每行返回所有列;
>当您最终获取更多行时,客户端将要求服务器提供更多行.这可能是在客户端耗尽或者可能是先发制人的情况下.这又是依赖于实现的.
所有这一切的想法是尽量减少到服务器的往返,而不会发回太多不必要的数据,这就是为什么如果你要求一百万行,你不会立刻得到它们.
LIMIT子句 – 或实际上的任何子句 – 将修改结果集.
最后,(7)很重要因为SELECT * FROM表WHERE a =’foo’和SELECT * FROM表WHERE a =’bar’就数据库优化器而言是两个不同的查询因此必须为每个查询确定执行计划分别.但是具有不同参数的参数化查询(SELECT * FROM table WHERE a =:param)是一个查询,只需要计划一次(至少直到它超出查询缓存).