对于每个可以产生一个结果集的命令(比如select、show、describe, explain, check_table等等),发起mysql_query或者mysql_real_query之后,你都需要调用mysql_store_result或者mysql_use_result语句,处理完结果集后需要使用mysql_free_result释放。
Mysql_use_result初始化一个取回结果集但是它并不像mysql_store_result那样实际的读取结果放到客户端。相反,每一个列结果都是通过调用mysql_fecth_row独立取回的。它直接从服务器读取一个查询的结果而不是存储它到一个临时表或者一个客户端的缓存里面。因此对于mysql_use_result而言它比mysql_store_result快一些并且使用更少的内存。客户端只有在当前的列或者通信的缓存即将超过max_allowed_packet才申请内存。
另外方面有些情况你不能使用mysql_use_result接口,当你对于每一列在客户端要做很多的的处理,或者输出发生到屏幕用户可能通过ctrl-s退出,这样会挂起服务器,而阻止其他线程去更新客户端正在获取数据的这些表。
当使用mysql_use_result时,你必须执行mysql_fetch_row直到NULL值返回。否则那些没有被获取的列将作为你下个请求的一部分返回。如果你忘了这个部分,对于C的API接口将报错” Commands out of sync; you can'trun this command now”。
你最好不要对mysql_use_result的结果,调用mysql_data_seek(),mysql_row_seek(),mysql_row_tell(),mysql_num_rows或者mysql_affected_row(),也不要在mysql_use_result没有结束的时候发起其他的请求(当你已经获取所以列以后,mysql_num_rows可以正确返回你获取的列数)。
一旦你处理完所有的结果集,你必须调用mysql_free_result去释放。
https://dev.mysql.com/doc/refman/8.0/en/mysql-use-result.html
MySQL官网文档介绍