当我使用mysql_query
时,Mysql实际上是立即执行查询,还是等到我调用mysql_fetch_*()
?
我的意思是如果a查询非常非常慢(例如。结果有许多记录),这些函数中哪个会运行缓慢?:)
From PHP.net manual of mysql_unbuffered_query
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
执行查询。如果它有任何行返回(SELECT
, SHOW
等语句),它获取结果并将其存储在 MYSQL_RES
c结构中。是否获取结果取决于它是否调用mysql_use_result
或mysql_store_result
C函数。后者存储整个结果。从mysql_use_result MySQL C API manual,
mysql_use_result()启动结果集检索,但不像mysql_store_result()那样实际将结果集读入客户端。相反,必须通过调用mysql_fetch_row()来单独检索每一行。直接从服务器读取查询结果,而不将其存储在临时表或本地缓冲区中,这比mysql_store_result()更快,使用的内存也少得多。
所以mysql_store_result
读取整个结果,但mysql_use_result
不读取。
mysql_query
的C代码是
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
这里php_mysql_do_query
调用php_mysql_do_query_general
,在php_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的内部缓冲区中获取。
如前所述,mysql_query
运行查询。因此,如果查询本身很慢(涉及复杂或未优化的条件等),则mysql_query
调用将花费一些时间。
如果查询是快速的,但导致太多的记录,那么像mysql_fetch_all
可能需要时间,因为所有的记录将不得不复制到PHP内存
调用mysql_query
时获取结果。mysql_fetch_*
只返回结果对象的相关部分。
回答您的问题,mysql_query()
运行查询,并返回mysql_fetch_*()
使用的资源。所以mysql_query()将是一个运行缓慢的查询。