對於每個可以產生一個結果集的命令(比如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官網文檔介紹