关于“mysql结果”资源

时间:2012-12-30 11:38:54

标签: php mysql

当我使用mysql_query时,Mysql是否会立即执行查询,还是等到我致电mysql_fetch_*()

我的意思是如果查询非常慢(例如,结果有很多记录),这些函数中的哪一个会运行缓慢? :)

4 个答案:

答案 0 :(得分:2)

要回答您的问题,mysql_query()会运行查询,并返回mysql_fetch_*()使用的资源。所以mysql_query()将是一个慢速查询运行缓慢的那个。

答案 1 :(得分:1)

致电mysql_query时会收到结果。 mysql_fetch_*只返回结果对象的相关部分。

答案 2 :(得分:1)

来自mysql_unbuffered_query的PHP.net手册,

  

mysql_unbuffered_query()将SQL查询查询发送到MySQL ,而不像mysql_query()那样自动获取和缓冲结果行。这样可以在生成大型结果集的SQL查询中节省大量内存,并且可以在检索到第一行后立即开始处理结果集,因为您不必等到执行完整的SQL查询。要在打开多个数据库连接时使用mysql_unbuffered_query(),必须指定可选参数link_identifier以标识要使用的连接。

因此,对于具有较大mysql结果mysql_query的查询将运行缓慢。您应该使用mysql_unbuffered_query

让我们看看mysql扩展中的mysql_query里面是什么。

mysql_query执行查询。如果要返回任何行(SELECTSHOW等语句),则会获取结果并将其存储在MYSQL_RES C结构中。是否获取结果取决于它是否调用mysql_use_resultmysql_store_result C函数。后者存储整个结果。来自mysql_use_result MySQL C API手册,

  

mysql_use_result()启动结果集检索,但实际上并没有像mysql_store_result()那样将结果集读入客户端。相反,必须通过调用mysql_fetch_row()来单独检索每一行。 直接从服务器读取查询结果,而不将其存储在临时表或本地缓冲区中,这比mysql_store_result()更快,使用的内存更少。

所以mysql_store_result读取整个结果但是mysql_use_result不要。

现在与mysql_query对应的C code

php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);

此处php_mysql_do_query调用php_mysql_do_query_generalphp_mysql_do_query_general函数PHP calls mysql_store_result

    if(use_store == MYSQL_USE_RESULT) { //use_store = MYSQL_STORE_RESULT here
    mysql_result=mysql_use_result(mysql->conn);
} else {
    mysql_result=mysql_store_result(mysql->conn);
}

因此 mysql_query立即运行查询并将整个结果集存储在内存中。因此,对于大型结果集,它可能会很慢。

一旦调用mysql_fetch_*函数,就会开始从PHP的inernal缓冲区中获取行。

答案 3 :(得分:1)

如前所述,mysql_query运行查询。因此,如果查询本身很慢(涉及复杂或非优化条件等),那么mysql_query调用将需要一些时间。

如果查询速度很快,但会导致记录过多,那么像mysql_fetch_all这样的东西可能需要一些时间,因为所有记录都必须复制到PHP内存中。