mysql_store_result vs mysql_use_result
在使用mysql_query
进行查询之后,必须调用 mysql_store_result
或者mysql_use_result
获取结果。
前者立即将剩余所有查询结果取回(可能会阻塞),后者不产生任何网络IO,从不阻塞,剩余查询结果将在后面mysql_fetch_row
需要时返回。
事实上除非查询结果集很大(实测约大于160k),否则基本在musql_query
执行完之后已经全部返回了(仍在系统的socket缓冲区,等待mysql_store_result 取走
)。
wireshark抓包结果:
mysql_store_result
:
- mysql_real_connect():
- 建立TCP连接
- server -> client : Server Greating
- client -> server : Login Request
- server -> client : Response OK
- mysql_query() :
- client -> server : Request Query
- server -> client : Response //包含部分查询的结果
- client -> server : TCP zero-window // 客户端接收缓存已满
- mysql_store_result(): //可能阻塞
- client -> server : non-zero-window //立即取走缓冲区数据,tcp连接的window恢复为非零
- server -> client : Response //包含所有剩余查询的结果(如果还有的话)
- mysql_fetch_now(): // 非阻塞
- 无。
- musql_close():
- client -> server : Request Quit
- tcp断开
mysql_use_result
:
- mysql_real_connect():
- 建立TCP连接
- server -> client : Server Greating
- client -> server : Login Request
- server -> client : Response OK
- mysql_query() :
- client -> server : Request Query
- server -> client : Response //包含部分的查询结果
- client -> server : TCP zero-window
- mysql_use_result():// 非阻塞
- 无。
- mysql_fetch_now(): // 可能阻塞
- 一开始fetch处理 mysql_query 返回的结果,此时无网络IO,之后:
- client -> server : non-zero-window //client取走缓冲区数据,tcp连接的window恢复为非零
- server -> client : Response // 部分剩余的查询结果
- musql_close():
- client -> server : Request Quit
- tcp断开