3

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

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

4

4 回答 4

2

来自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_querymysql扩展里面有什么。

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

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

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

现在 对应 的C代码mysql_query

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 调用 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 的内部缓冲区中获取行。

于 2012-12-30T11:46:05.883 回答
1

调用时会获取结果mysql_querymysql_fetch_*只返回结果对象的相关部分。

于 2012-12-30T11:40:56.987 回答
1

回答您的问题,mysql_query()运行查询,并返回由mysql_fetch_*(). 所以 mysql_query() 将是一个慢查询运行缓慢的查询。

于 2012-12-30T11:42:06.737 回答
1

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

如果查询速度很快,但导致记录太多,则mysql_fetch_all可能需要一些时间,因为所有记录都必须复制到 PHP 内存中。

于 2012-12-30T11:47:34.463 回答