当我使用时mysql_query
,Mysql 是否真的立即执行查询,还是等到我打电话mysql_fetch_*()
?
我的意思是如果查询非常慢(例如,结果有很多记录),这些函数中的哪一个会运行得很慢?:)
来自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_query
mysql扩展里面有什么。
mysql_query
执行查询。如果它有任何要返回的行(SELECT
等SHOW
语句),它会获取结果并将其存储在MYSQL_RES
C 结构中。它是否获取结果取决于它是调用mysql_use_result
还是mysql_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
不要。
现在 对应 的C代码mysql_query
是
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_fetch_*
只返回结果对象的相关部分。
回答您的问题,mysql_query()
运行查询,并返回由mysql_fetch_*()
. 所以 mysql_query() 将是一个慢查询运行缓慢的查询。
如前所述,mysql_query
运行查询。因此,如果查询本身很慢(涉及复杂或未优化的条件等),那么mysql_query
调用将需要一些时间。
如果查询速度很快,但导致记录太多,则mysql_fetch_all
可能需要一些时间,因为所有记录都必须复制到 PHP 内存中。