2010-02-07 73 views
5

我已经使用了很多MySQL,但我总是很好奇它是如何工作的 - 当我得到肯定的结果时,数据在哪里存储?例如,我写的是这样的:PHP/MySQL数据库查询如何正确工作?

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

当返回一个结果,我假设它所持有的所有数据结果或它的片段回来,只返回在那里问,像$按行>栏吗?

或者它真的会返回每一行数据,即使您只想要$ result中的一列?另外,如果我使用LIMIT进行分页,那么即使更新数据库,它是否保留原始(旧)结果?

回答

8

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

认为序列是这样的:

  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)是一个查询并且只需要计划一次(至少直到它落在查询缓存之外)。

+0

我已经从不太了解参数化查询如何工作。执行参数化查询以将SELECT * FROM table WHERE a =:param'与参数一起发送到数据库引擎的正常方法是什么?我认为':param'会被客户端的值所取代。 – jnylen 2010-02-07 02:39:42

+0

将参数化查询(可能从客户端库转换为数据库可理解的内容)连同参数一起发送到数据库。 – cletus 2010-02-07 02:54:15

1

的第一个问题可以通过在resources

读书以来您选择的是“*”,则返回每列各mysql_fetch_object调用来回答。只要看看print_r($ row)就可以看到。

+1

“为每个'mysql_fetch_object'调用返回每一行??”当然你的意思是每个_column_。 – jnylen 2010-02-07 02:18:41

7

我认为你混淆了你正在处理的两种变量类型,而且迄今为止这两个变量都没有明确说明。

$result是一个MySQL结果对象。它不包含任何行。“当你说$result = mysql_query($sql)时,MySQL执行查询,并知道哪些行将匹配,但数据尚未传输到PHP端。 $result可以被认为是一个指向您要求MySQL执行的查询的指针。

当你说$row = mysql_fetch_object($result),那是PHP的MySQL接口为你检索一行。只有该行被放入$row(作为普通的旧PHP对象,但可以使用不同的获取函数来请求关联数组或每行中的特定列)。

行可以用期望您将以紧密的循环方式(通常是这种情况)检索所有行,但通常情况下,当您使用mysql_fetch_*函数之一请求时,将检索行。

如果您只希望从数据库获得一列,那么您应该使用SELECT that_column FROM ...。如果可能的话,使用LIMIT子句也是一个好主意,因为如果MySQL知道你只需要某个特定的行组,它通常可以执行显着的优化。

0

简而言之,资源返回它就像MySQL库与其他数据关联的ID。我认为它就像你钱包中的身份证,它只是一个数字和一些信息,但如果你把它交给政府,或者你的手机公司等,则会与更多的信息分享。