如果我向mysql服务器发出:select * from tuser where name='Bob'
。 mysql服务器会做什么,检索一条记录,然后立即将它发送到客户端,或者在检索一堆数据然后将它们一起发送,然后继续进行其余的结果?
答案 0 :(得分:2)
随着执行的进行,结果将返回给客户端程序。当行“冒出”执行树时,顶级操作员通常负责将这些行写入网络缓冲区并将它们发送回客户端。结果不是首先创建到某个中间存储(内存或磁盘),然后发送回客户端,而是在创建时(当查询执行时)发回。当然,将结果发送回客户端受网络流量控制协议的约束。如果客户端没有主动使用结果(例如,通过调用SqlDataReader.Read()),那么最终流控制将必须阻止发送方(正在执行的查询),这反过来将暂停执行查询。一旦网络流控制释放所需的网络资源,查询就会恢复并产生更多结果(继续迭代执行计划)。
因此,查询结果会在查询执行时发送给客户端"。
Here您可以阅读有关SQL服务器如何执行查询的更多信息。
答案 1 :(得分:2)
在网络协议级别,一旦服务器找到/构造记录,就会一次一行地将行发送到客户端 - 除了查询缓存(对于后续相同的查询)和服务器端缓存之外没有服务器端缓冲网络I / O缓冲区(由net_buffer_length配置参数控制,默认为16K)。在客户端,您可能会看到一些缓冲,具体取决于您对客户端使用的内容和设置。本机C libmysqlclient有两个调用 - mysql_use_result()和mysql_store_result()。第一个做缓冲,第二个做缓冲。大多数高级语言都有客户端API,它们包含libmysqlclient,并且可以选择使用缓冲区或非缓冲方法。