当我使用mysql_query
时,Mysql是否会立即执行查询,还是等到我致电mysql_fetch_*()
?
我的意思是如果查询非常慢(例如,结果有很多记录),这些函数中的哪一个会运行缓慢? :)
答案 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
执行查询。如果要返回任何行(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
不要。
现在与mysql_query
对应的C code是
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 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内存中。