MySQL 在流式传输 ResultSet 时是不是使用服务器端预取

Posted

技术标签:

【中文标题】MySQL 在流式传输 ResultSet 时是不是使用服务器端预取【英文标题】:Does MySQL use server-side pre-fetching when streaming a ResultSetMySQL 在流式传输 ResultSet 时是否使用服务器端预取 【发布时间】:2016-06-27 19:03:52 【问题描述】:

mysql JDBC 连接器定义了两种获取模式:

默认的一次获取整个 ResultSet 流式传输,当statement fetchSize is set to Integer.MIN_VALUE

根据文档,流式传输将单独获取每一行,一次一个。

    当使用流式传输时,每一行都在单独的数据库往返中获取,这是真的吗?

    MySQL 服务器是提前预取结果集还是一次遍历服务器端游标一行?

【问题讨论】:

这不是***.com/questions/35346229/…的复制品吗? 可能是这样,虽然这个问题实际上包含两个问题。 【参考方案1】:

我相信简短的回答是肯定的。我不知道适用于mysql_use_result/mysql_store_result 的细微差别,但有几种类型的预取:

下面的 InnoDB 存储引擎有预读功能,所以会提前开始抓取页面。

某些查询确实需要完全具体化,然后才能一次以流式传输行(想想不使用索引的排序,或不使用松散索引扫描的分组)。如果发生这种情况,临时表将使用show profiles 功能显示。

最后,在 MySQL 5.6+ 中,可以对存储引擎的检索进行批处理 (BKA)。这可能是您暗示的情况,填充的缓冲区称为join_buffer_size

【讨论】:

以上是关于MySQL 在流式传输 ResultSet 时是不是使用服务器端预取的主要内容,如果未能解决你的问题,请参考以下文章

在后台流式传输 youtube 视频是不是合法?

检查用户是不是在不和谐的 vc 中进行流式传输

Amazon DynamoDB 是不是支持查询结果的流式传输

在 try-with-resources 块之外流式传输 JOOQ 结果时,我是不是会冒 JDBC 连接泄漏的风险?

如何判断我编写的 XSLT 3.0 是不是实际上是流式传输 XML?

从其他 Google Cloud 服务流式传输数据时,是不是可以修复失败的 BigQuery 插入?