在使用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断开